SlideShare uma empresa Scribd logo
1 de 26
Baixar para ler offline
Lobos      Introduction
Presentation given to the Bonjure group on 2011/01/21.
Outline
●   Overview & basic concepts
●   Past: history and development
    highlights
●   Present: examples, project structure
    and architecture
●   Future: migrations and declarative
    schema manipulation
Overview
     Clojure code                      SQL Statement(s)*

(create                           CREATE TABLE "users" (
 (table :users                      "name" VARCHAR(100),
   (integer :id :auto-inc           "id" SERIAL,
                :primary-key)       CONSTRAINT "min_length"
   (varchar :name 100 :unique)        CHECK (length("name") > 1),
   (check :min_length               CONSTRAINT "users_unique_name"
          (> :length/name 1))))       UNIQUE ("name"),
                                    CONSTRAINT "users_primary_key_id"
                                      PRIMARY KEY ("id"))



      Note that the syntax is partially inspired by
           ActiveRecord::Migration
        *This example use the PostgreSQL backend.
Basic Concepts
●   Abstract Schema Definition: Used
    internally to represent a database
    schema.
●   Action: Functions executing
    imperative SQL statements.
●   AST: Intermediate database-agnostic
    representation of SQL statements.
Past
History
●   Lobos is based on the original
    ClojureQL project which was based
    on SchemeQL.
●   It's a complete rewrite of the DDL part.
●   Lobos is less than a month old and a
    one-man effort for now.
Development Highlights
●   Uses most Clojure features and best
    practices.
●   Namespace structure makes the
    project very modular.
●   Bugs in Clojure code can be hard to
    diagnose, beware of laziness!
Present
Examples
(use 'lobos.connectivity)


(def pg
  {:classname      "org.postgresql.Driver"
   :subprotocol    "postgresql"
   :user           "test"
   :password       "test123"
   :subname        "//localhost:5432/test"})


(open-global pg)
(close-global)                   ||       (open-global :pg pg)
                                          (close-global :pg)



You can specify a connection map (or global
connection name) as the first argument of an
action or use the global default connection.
Examples
All elements are constructed using functions or macros that yield
Clojure data structures and thus are composable. Here we define
some helpers:
(use 'lobos.schema)


(defn surrogate-key [table]
  (integer table :id :auto-inc :primary-key))


(defmacro tabl [name & elements]
  `(-> (table ~name (surrogate-key))
       ~@elements))


(defn refer-to [table ptable]
  (let [cname (-> (->> ptable name butlast (apply str))
                  (str "_id")
                  keyword)]
    (integer table cname [:refer ptable :id
                                 :on-delete :set-null])))
Examples
With the previously defined custom functions and macros we can
define a more complex schema with less code...

(use 'lobos.core)


(defschema sample-schema :lobos

  (tabl :users
    (varchar :name 100 :unique)
    (check :name (> :length/name 1)))

  (tabl :posts
    (varchar :title 200 :unique)
    (text :content)
    (refer-to :users))

  (tabl :comments
    (text :content)
    (refer-to :users)
    (refer-to :posts)))
Examples
Schemas created with defschema are functions returning an
abstract schema!
(create-schema sample-schema)


(set-default-schema sample-schema)


(drop (table :posts) :cascade)


(drop-schema sample-schema :cascade)



The cascade behavior works even in SQL Server which doesn't
support that feature!
Dropping a schema created with defschema makes the defined
function return nil, so just pretend we didn't evaled that line!
   Warning: all uses of exclamation points in this slide are completely superfluous!
Examples
(alter :add (table :users (text :bio)))


(alter :add (table :users
              (text :location)
              (text :occupation)))


(alter :add (table :posts
              (check :content_limit
                     (< :length/content 1337))))


(alter :modify (table :users
                 (column :location
                         [:default "somewhere"])))


(alter :drop (table :users (column :occupation)))


(alter :rename (table :users
                 (column :location :to :origin)))
Any questions yet?

Do we need a break?
Project Structure
●   Frontend
       lobos.core
       lobos.schema
       lobos.connectivity
●   Backend
       lobos.compiler
       lobos.ast
       lobos.backends.*
●   Analyzer
       lobos.metadata
       lobos.analyzer
Project Structure
connectivity      core
                              *
     analyzer   schema       utils



     metadata     ast      compiler




                backends
Architecture
● Actions yield Abstract Schema
  Definitions
● Schema protocols build a AST(s) from

  ASDs
● The compiler (compile multi-method)

  generates the appropriate SQL
  statements from an AST.
● The analyzer constructs an abstract

  schema ASD from a real schema.
Architecture
(defrecord Table [name columns constraints options]
  Alterable Creatable Dropable

 (build-alter-statement [this action db-spec]
   (let [elements (map #(build-definition (second %) db-spec)
                       (concat columns constraints))]
     (for [element elements]
       (AlterTableStatement.
        db-spec
        name
        action
        element))))

 (build-create-statement [this db-spec]
   (CreateTableStatement.
    db-spec
    name
    (map #(build-definition (second %) db-spec)
         (concat columns constraints))))

 (build-drop-statement [this behavior db-spec]
   (DropStatement. db-spec :table name behavior)))
Architecture
(def backends-hierarchy
  (atom (-> (make-hierarchy)
            (derive :h2 ::standard)
            (derive :mysql ::standard)
            (derive :postgresql ::standard)
            (derive :sqlite ::standard)
            (derive :sqlserver ::standard))))

(defmulti compile
  (fn [o]
    [(-> o :db-spec :subprotocol (or ::standard) keyword)
     (type o)])
  :hierarchy backends-hierarchy)

...

(defmethod compile [::standard AutoIncClause] [_]
  "GENERATED ALWAYS AS IDENTITY")

...
(defmethod compile [:mysql AutoIncClause] [_]
  "AUTO_INCREMENT")
Future
Migrations
Objectives:
 ●   Could be written manually, like in
     ActiveRecord::Migration
 ●   Could be automatically generated
     when actions are entered at the
     REPL
 ●   Also automatically generated when
     declaratively changing a schema
     definition (see next slide)
Declarative Schema Manipulation
Say we are working on a database built from the following
schema:
(defschema sample-schema :lobos

  (table :users
    (varchar :name 100 :unique)
    (check :name (> :length/name 1)))
...


Instead of imperatively issuing alter statements, wouldn't it
be great to just change it?
(defschema sample-schema :lobos

  (table :users
    (varchar :name 100 :unique)
    (text :bio)
    (check :name (> :length/name 1)))
...
I need your help!
 Visit the project's
    github page:
    https://github.com/budu/lobos


   Any questions
    suggestions,
comments or insults?
Links
Website:
  http://budu.github.com/lobos/
Code Repository:
  https://github.com/budu/lobos
Issue Tracker:
  https://github.com/budu/lobos/issues
Wiki:
  https://github.com/budu/lobos/wiki
Acknowledgments
Thanks (in alphabetical order) to:
 ● James Reeves (for Hiccup)
 ● Lau B. Jensen (for the old and new ClojureQLs)


 ● Meikel Brandmeyer (for working with me on the old ClojureQL)


 ● Michael Fogus (for Marginalia and "The Joy of Clojure" book)


 ● Phil Hagelberg (for Leiningen)


 ● Rich Hickey (for Clojure)


 ● Stephen C. Gilardi (for clojure.contrib.sql)




Also thanks to all Clojure contributors and to
its fantastic community!
The End!

Mais conteúdo relacionado

Mais procurados

SenchaCon 2016: Theming the Modern Toolkit - Phil Guerrant
SenchaCon 2016: Theming the Modern Toolkit - Phil Guerrant   SenchaCon 2016: Theming the Modern Toolkit - Phil Guerrant
SenchaCon 2016: Theming the Modern Toolkit - Phil Guerrant Sencha
 
Perl Stored Procedures for MySQL (2009)
Perl Stored Procedures for MySQL (2009)Perl Stored Procedures for MySQL (2009)
Perl Stored Procedures for MySQL (2009)Antony T Curtis
 
Using Perl Stored Procedures for MariaDB
Using Perl Stored Procedures for MariaDBUsing Perl Stored Procedures for MariaDB
Using Perl Stored Procedures for MariaDBAntony T Curtis
 
SenchaCon 2016: Modernizing the Ext JS Class System - Don Griffin
SenchaCon 2016: Modernizing the Ext JS Class System - Don GriffinSenchaCon 2016: Modernizing the Ext JS Class System - Don Griffin
SenchaCon 2016: Modernizing the Ext JS Class System - Don GriffinSencha
 
Data Processing Inside PostgreSQL
Data Processing Inside PostgreSQLData Processing Inside PostgreSQL
Data Processing Inside PostgreSQLEDB
 
External Language Stored Procedures for MySQL
External Language Stored Procedures for MySQLExternal Language Stored Procedures for MySQL
External Language Stored Procedures for MySQLAntony T Curtis
 
Flux: Apache Storm Frictionless Topology Configuration & Deployment
Flux: Apache Storm Frictionless Topology Configuration & DeploymentFlux: Apache Storm Frictionless Topology Configuration & Deployment
Flux: Apache Storm Frictionless Topology Configuration & DeploymentP. Taylor Goetz
 
Developing Applications with MySQL and Java for beginners
Developing Applications with MySQL and Java for beginnersDeveloping Applications with MySQL and Java for beginners
Developing Applications with MySQL and Java for beginnersSaeid Zebardast
 
Doctrine 2
Doctrine 2Doctrine 2
Doctrine 2zfconfua
 

Mais procurados (18)

My sql tutorial-oscon-2012
My sql tutorial-oscon-2012My sql tutorial-oscon-2012
My sql tutorial-oscon-2012
 
wtf is in Java/JDK/wtf7?
wtf is in Java/JDK/wtf7?wtf is in Java/JDK/wtf7?
wtf is in Java/JDK/wtf7?
 
SenchaCon 2016: Theming the Modern Toolkit - Phil Guerrant
SenchaCon 2016: Theming the Modern Toolkit - Phil Guerrant   SenchaCon 2016: Theming the Modern Toolkit - Phil Guerrant
SenchaCon 2016: Theming the Modern Toolkit - Phil Guerrant
 
Polyglot Persistence
Polyglot PersistencePolyglot Persistence
Polyglot Persistence
 
Perl Stored Procedures for MySQL (2009)
Perl Stored Procedures for MySQL (2009)Perl Stored Procedures for MySQL (2009)
Perl Stored Procedures for MySQL (2009)
 
Using Perl Stored Procedures for MariaDB
Using Perl Stored Procedures for MariaDBUsing Perl Stored Procedures for MariaDB
Using Perl Stored Procedures for MariaDB
 
SenchaCon 2016: Modernizing the Ext JS Class System - Don Griffin
SenchaCon 2016: Modernizing the Ext JS Class System - Don GriffinSenchaCon 2016: Modernizing the Ext JS Class System - Don Griffin
SenchaCon 2016: Modernizing the Ext JS Class System - Don Griffin
 
Data Processing Inside PostgreSQL
Data Processing Inside PostgreSQLData Processing Inside PostgreSQL
Data Processing Inside PostgreSQL
 
My sql1
My sql1My sql1
My sql1
 
External Language Stored Procedures for MySQL
External Language Stored Procedures for MySQLExternal Language Stored Procedures for MySQL
External Language Stored Procedures for MySQL
 
Clojure Deep Dive
Clojure Deep DiveClojure Deep Dive
Clojure Deep Dive
 
java
javajava
java
 
Flux: Apache Storm Frictionless Topology Configuration & Deployment
Flux: Apache Storm Frictionless Topology Configuration & DeploymentFlux: Apache Storm Frictionless Topology Configuration & Deployment
Flux: Apache Storm Frictionless Topology Configuration & Deployment
 
es6
es6es6
es6
 
Oracle adapters for Ruby ORMs
Oracle adapters for Ruby ORMsOracle adapters for Ruby ORMs
Oracle adapters for Ruby ORMs
 
Developing Applications with MySQL and Java for beginners
Developing Applications with MySQL and Java for beginnersDeveloping Applications with MySQL and Java for beginners
Developing Applications with MySQL and Java for beginners
 
MySQL
MySQLMySQL
MySQL
 
Doctrine 2
Doctrine 2Doctrine 2
Doctrine 2
 

Destaque

Destaque (6)

Starkus_2011
Starkus_2011Starkus_2011
Starkus_2011
 
Welcome to CEO
Welcome to CEOWelcome to CEO
Welcome to CEO
 
Robin hood and arthur
Robin hood and arthurRobin hood and arthur
Robin hood and arthur
 
Power point Hardware
Power point HardwarePower point Hardware
Power point Hardware
 
секція 2010 2011
секція 2010 2011секція 2010 2011
секція 2010 2011
 
Part6g
Part6gPart6g
Part6g
 

Semelhante a Lobos Introduction

Exploring Clojurescript
Exploring ClojurescriptExploring Clojurescript
Exploring ClojurescriptLuke Donnet
 
Getting started with Clojure
Getting started with ClojureGetting started with Clojure
Getting started with ClojureJohn Stevenson
 
Domain-Specific Languages for Composable Editor Plugins (LDTA 2009)
Domain-Specific Languages for Composable Editor Plugins (LDTA 2009)Domain-Specific Languages for Composable Editor Plugins (LDTA 2009)
Domain-Specific Languages for Composable Editor Plugins (LDTA 2009)lennartkats
 
Obevo Javasig.pptx
Obevo Javasig.pptxObevo Javasig.pptx
Obevo Javasig.pptxLadduAnanu
 
10 Reasons to Start Your Analytics Project with PostgreSQL
10 Reasons to Start Your Analytics Project with PostgreSQL10 Reasons to Start Your Analytics Project with PostgreSQL
10 Reasons to Start Your Analytics Project with PostgreSQLSatoshi Nagayasu
 
JavaScript Growing Up
JavaScript Growing UpJavaScript Growing Up
JavaScript Growing UpDavid Padbury
 
Solid And Sustainable Development in Scala
Solid And Sustainable Development in ScalaSolid And Sustainable Development in Scala
Solid And Sustainable Development in ScalaKazuhiro Sera
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Ontico
 
PofEAA and SQLAlchemy
PofEAA and SQLAlchemyPofEAA and SQLAlchemy
PofEAA and SQLAlchemyInada Naoki
 
Solid and Sustainable Development in Scala
Solid and Sustainable Development in ScalaSolid and Sustainable Development in Scala
Solid and Sustainable Development in Scalascalaconfjp
 
Intro to Spark and Spark SQL
Intro to Spark and Spark SQLIntro to Spark and Spark SQL
Intro to Spark and Spark SQLjeykottalam
 
No Coding Necessary: Building User Macros and Dynamic Reports Inside Confluen...
No Coding Necessary: Building User Macros and Dynamic Reports Inside Confluen...No Coding Necessary: Building User Macros and Dynamic Reports Inside Confluen...
No Coding Necessary: Building User Macros and Dynamic Reports Inside Confluen...Atlassian
 
ClojureScript for the web
ClojureScript for the webClojureScript for the web
ClojureScript for the webMichiel Borkent
 

Semelhante a Lobos Introduction (20)

Slickdemo
SlickdemoSlickdemo
Slickdemo
 
Scala active record
Scala active recordScala active record
Scala active record
 
Exploring Clojurescript
Exploring ClojurescriptExploring Clojurescript
Exploring Clojurescript
 
Getting started with Clojure
Getting started with ClojureGetting started with Clojure
Getting started with Clojure
 
Clojure And Swing
Clojure And SwingClojure And Swing
Clojure And Swing
 
Domain-Specific Languages for Composable Editor Plugins (LDTA 2009)
Domain-Specific Languages for Composable Editor Plugins (LDTA 2009)Domain-Specific Languages for Composable Editor Plugins (LDTA 2009)
Domain-Specific Languages for Composable Editor Plugins (LDTA 2009)
 
Obevo Javasig.pptx
Obevo Javasig.pptxObevo Javasig.pptx
Obevo Javasig.pptx
 
10 Reasons to Start Your Analytics Project with PostgreSQL
10 Reasons to Start Your Analytics Project with PostgreSQL10 Reasons to Start Your Analytics Project with PostgreSQL
10 Reasons to Start Your Analytics Project with PostgreSQL
 
Play vs Rails
Play vs RailsPlay vs Rails
Play vs Rails
 
JavaScript Growing Up
JavaScript Growing UpJavaScript Growing Up
JavaScript Growing Up
 
Solid And Sustainable Development in Scala
Solid And Sustainable Development in ScalaSolid And Sustainable Development in Scala
Solid And Sustainable Development in Scala
 
Pune Clojure Course Outline
Pune Clojure Course OutlinePune Clojure Course Outline
Pune Clojure Course Outline
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
 
PofEAA and SQLAlchemy
PofEAA and SQLAlchemyPofEAA and SQLAlchemy
PofEAA and SQLAlchemy
 
Solid and Sustainable Development in Scala
Solid and Sustainable Development in ScalaSolid and Sustainable Development in Scala
Solid and Sustainable Development in Scala
 
Sql lite android
Sql lite androidSql lite android
Sql lite android
 
Sqlapi0.1
Sqlapi0.1Sqlapi0.1
Sqlapi0.1
 
Intro to Spark and Spark SQL
Intro to Spark and Spark SQLIntro to Spark and Spark SQL
Intro to Spark and Spark SQL
 
No Coding Necessary: Building User Macros and Dynamic Reports Inside Confluen...
No Coding Necessary: Building User Macros and Dynamic Reports Inside Confluen...No Coding Necessary: Building User Macros and Dynamic Reports Inside Confluen...
No Coding Necessary: Building User Macros and Dynamic Reports Inside Confluen...
 
ClojureScript for the web
ClojureScript for the webClojureScript for the web
ClojureScript for the web
 

Último

HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesBoston Institute of Analytics
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobeapidays
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?Igalia
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...DianaGray10
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsJoaquim Jorge
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProduct Anonymous
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdflior mazor
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024The Digital Insurer
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...apidays
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherRemote DBA Services
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAndrey Devyatkin
 

Último (20)

HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation Strategies
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 

Lobos Introduction

  • 1. Lobos Introduction Presentation given to the Bonjure group on 2011/01/21.
  • 2. Outline ● Overview & basic concepts ● Past: history and development highlights ● Present: examples, project structure and architecture ● Future: migrations and declarative schema manipulation
  • 3. Overview Clojure code SQL Statement(s)* (create CREATE TABLE "users" ( (table :users "name" VARCHAR(100), (integer :id :auto-inc "id" SERIAL, :primary-key) CONSTRAINT "min_length" (varchar :name 100 :unique) CHECK (length("name") > 1), (check :min_length CONSTRAINT "users_unique_name" (> :length/name 1)))) UNIQUE ("name"), CONSTRAINT "users_primary_key_id" PRIMARY KEY ("id")) Note that the syntax is partially inspired by ActiveRecord::Migration *This example use the PostgreSQL backend.
  • 4. Basic Concepts ● Abstract Schema Definition: Used internally to represent a database schema. ● Action: Functions executing imperative SQL statements. ● AST: Intermediate database-agnostic representation of SQL statements.
  • 6. History ● Lobos is based on the original ClojureQL project which was based on SchemeQL. ● It's a complete rewrite of the DDL part. ● Lobos is less than a month old and a one-man effort for now.
  • 7. Development Highlights ● Uses most Clojure features and best practices. ● Namespace structure makes the project very modular. ● Bugs in Clojure code can be hard to diagnose, beware of laziness!
  • 9. Examples (use 'lobos.connectivity) (def pg {:classname "org.postgresql.Driver" :subprotocol "postgresql" :user "test" :password "test123" :subname "//localhost:5432/test"}) (open-global pg) (close-global) || (open-global :pg pg) (close-global :pg) You can specify a connection map (or global connection name) as the first argument of an action or use the global default connection.
  • 10. Examples All elements are constructed using functions or macros that yield Clojure data structures and thus are composable. Here we define some helpers: (use 'lobos.schema) (defn surrogate-key [table] (integer table :id :auto-inc :primary-key)) (defmacro tabl [name & elements] `(-> (table ~name (surrogate-key)) ~@elements)) (defn refer-to [table ptable] (let [cname (-> (->> ptable name butlast (apply str)) (str "_id") keyword)] (integer table cname [:refer ptable :id :on-delete :set-null])))
  • 11. Examples With the previously defined custom functions and macros we can define a more complex schema with less code... (use 'lobos.core) (defschema sample-schema :lobos (tabl :users (varchar :name 100 :unique) (check :name (> :length/name 1))) (tabl :posts (varchar :title 200 :unique) (text :content) (refer-to :users)) (tabl :comments (text :content) (refer-to :users) (refer-to :posts)))
  • 12. Examples Schemas created with defschema are functions returning an abstract schema! (create-schema sample-schema) (set-default-schema sample-schema) (drop (table :posts) :cascade) (drop-schema sample-schema :cascade) The cascade behavior works even in SQL Server which doesn't support that feature! Dropping a schema created with defschema makes the defined function return nil, so just pretend we didn't evaled that line! Warning: all uses of exclamation points in this slide are completely superfluous!
  • 13. Examples (alter :add (table :users (text :bio))) (alter :add (table :users (text :location) (text :occupation))) (alter :add (table :posts (check :content_limit (< :length/content 1337)))) (alter :modify (table :users (column :location [:default "somewhere"]))) (alter :drop (table :users (column :occupation))) (alter :rename (table :users (column :location :to :origin)))
  • 14. Any questions yet? Do we need a break?
  • 15. Project Structure ● Frontend  lobos.core  lobos.schema  lobos.connectivity ● Backend  lobos.compiler  lobos.ast  lobos.backends.* ● Analyzer  lobos.metadata  lobos.analyzer
  • 16. Project Structure connectivity core * analyzer schema utils metadata ast compiler backends
  • 17. Architecture ● Actions yield Abstract Schema Definitions ● Schema protocols build a AST(s) from ASDs ● The compiler (compile multi-method) generates the appropriate SQL statements from an AST. ● The analyzer constructs an abstract schema ASD from a real schema.
  • 18. Architecture (defrecord Table [name columns constraints options] Alterable Creatable Dropable (build-alter-statement [this action db-spec] (let [elements (map #(build-definition (second %) db-spec) (concat columns constraints))] (for [element elements] (AlterTableStatement. db-spec name action element)))) (build-create-statement [this db-spec] (CreateTableStatement. db-spec name (map #(build-definition (second %) db-spec) (concat columns constraints)))) (build-drop-statement [this behavior db-spec] (DropStatement. db-spec :table name behavior)))
  • 19. Architecture (def backends-hierarchy (atom (-> (make-hierarchy) (derive :h2 ::standard) (derive :mysql ::standard) (derive :postgresql ::standard) (derive :sqlite ::standard) (derive :sqlserver ::standard)))) (defmulti compile (fn [o] [(-> o :db-spec :subprotocol (or ::standard) keyword) (type o)]) :hierarchy backends-hierarchy) ... (defmethod compile [::standard AutoIncClause] [_] "GENERATED ALWAYS AS IDENTITY") ... (defmethod compile [:mysql AutoIncClause] [_] "AUTO_INCREMENT")
  • 21. Migrations Objectives: ● Could be written manually, like in ActiveRecord::Migration ● Could be automatically generated when actions are entered at the REPL ● Also automatically generated when declaratively changing a schema definition (see next slide)
  • 22. Declarative Schema Manipulation Say we are working on a database built from the following schema: (defschema sample-schema :lobos (table :users (varchar :name 100 :unique) (check :name (> :length/name 1))) ... Instead of imperatively issuing alter statements, wouldn't it be great to just change it? (defschema sample-schema :lobos (table :users (varchar :name 100 :unique) (text :bio) (check :name (> :length/name 1))) ...
  • 23. I need your help! Visit the project's github page: https://github.com/budu/lobos Any questions suggestions, comments or insults?
  • 24. Links Website: http://budu.github.com/lobos/ Code Repository: https://github.com/budu/lobos Issue Tracker: https://github.com/budu/lobos/issues Wiki: https://github.com/budu/lobos/wiki
  • 25. Acknowledgments Thanks (in alphabetical order) to: ● James Reeves (for Hiccup) ● Lau B. Jensen (for the old and new ClojureQLs) ● Meikel Brandmeyer (for working with me on the old ClojureQL) ● Michael Fogus (for Marginalia and "The Joy of Clojure" book) ● Phil Hagelberg (for Leiningen) ● Rich Hickey (for Clojure) ● Stephen C. Gilardi (for clojure.contrib.sql) Also thanks to all Clojure contributors and to its fantastic community!