SlideShare a Scribd company logo
1 of 33
Download to read offline
Drupal adatbázis API




              
Több adatbázis támogatása
    ●   Drupal 6
           ●   MySQL: támogatott
           ●   PostgreSQL: core támogatja, contribok kevésbé
           ●   MSSQL: a Microsoft nagyon szeretné
           ●   Oracle: contribként elérhető
    ●   Drupal 7
           ●   MySQL: támogatott
           ●   PostgreSQL: tesztekkel bizonyítottan támogatott

                                     
Könnyűsúlyú API
    ●   Előny
           ●   Kevés visszaesés teljesítményben
           ●   Könnyen használható
    ●   Hátrány
           ●   SQL írásakor nagyon figyelni kell a szintaxisra
           ●   Csak olyan funkciókra lehet támaszkodni, amelyek 
                mindegyik támogatott adatbáziskezelőn elérhetőek



                                      
Szintaxis különbség
    ●   Tábla neveket körbe kell venni {}­kkel
    ●   Értékek helyett placeholderek
    ●   Példa
             SELECT ”name” FROM {users} WHERE uid = %d




                                
Függvények

db_add_field, db_add_index, db_add_primary_key, db_add_unique_key,
db_affected_rows, db_change_field, db_check_setup,
db_column_exists, db_connect, db_create_table, db_create_table_sql,
db_decode_blob, db_distinct_field, db_drop_field, db_drop_index,
db_drop_primary_key, db_drop_table, db_drop_unique_key,
db_encode_blob, db_error, db_escape_string, db_escape_table,
db_fetch_array, db_fetch_object, db_field_names, db_field_set_default,
db_field_set_no_default, db_is_active, db_last_insert_id, db_lock_table,
db_placeholders, db_prefix_tables, db_query, db_query_range,
db_query_temporary, db_rename_table, db_result, db_rewrite_sql,
db_set_active, db_status_report, db_table_exists, db_type_map,
db_type_placeholder, db_unlock_tables, db_version, pager_query,
tablesort_sql, update_sql



                                     
Példák
    ●   Rossz példa:
             $res = db_query(”SELECT * FROM {users} 
               WHERE uid = $uid”);




                                
Példák
    ●   Mi van, ha a valahonnan kapott $uid tartalma a 
         következő:
             1; UPDATE users SET pass = md5('iamhacked')




                                 
Akkor bizony 
     megtörtek :(




                     
Példák
    ●   Az előző példa helyesen
             $res = db_query(”SELECT * FROM {users} 
               WHERE uid = %d”, $uid);
    ●   Az uid lehet bármi, a %d miatt numerikus értékké 
         lesz konvertálva.
    ●   Az előző rosszindulatú paraméter esetén 1 lesz.




                                   
String
    ●   String használata
             $res = db_query(”SELECT uid, name FROM 
               {users} WHERE name = '%s'”, $searchstring);




                                  
További típusok
    ●   Float
                $res = db_query(”SELECT * FROM {spec_tabla} 
                  WHERE valami_mezo > %F”, $float_ertek);




                                   
További típusok
    ●   Bináris
             $res = db_query(”UPDATE {spec_tabla} SET 
               valami_adat = %b WHERE id = %d”, 
               $binaris_adat, $id);




                                
A % escape-elése

    %%


    db_query('SELECT nid FROM {node} WHERE 
      title LIKE '%%%s%%' ORDER BY nid DESC', 
      $searchstring);




                         
Változó számú érték

    $data = array(1, 2, 3);
    db_query('SELECT foo FROM {bar} WHERE 
      client_id IN (' . db_placeholders($data, 'int') . ') 
      ORDER BY client_id', $data);




                               
Tábla nevek

    db_escape_table()


    db_query('SELECT * FROM {' . 
      db_escape_table($table) . '}');




                             
Schema API




              
Schema API
    ●   Automatikus adatbázisséma generálás
           ●   Biztosan adatbázisfüggetlen lesz a kód, amit generál
           ●   Könnyebb karbantartani
           ●   Könnyen lehet csak egyes részeket felhasználni




                                     
hook_schema()
    ●   Használat (.install):
             mymodule_schema() {
                     $schema = array(...);
                     return $schema;
             }
             mymodule_install() {
                     drupal_install_schema('mymodule');
             }
             mymodule_uninstall() {
                     drupal_uninstall_schema('mymodule');
             }
                                         
Schema tömb


array(
  'tablaneve' => array(
    'fields' => $fields,
    'indexes' => $indexes,
    'unique keys' => $unique_keys,
    'primary key' => $primary_key,
  ),
);


                          
Mezők
array(
  'mezoneve' => array(
    'type' => $tipus,
    'unsigned' => TRUE, // csak numerikus típussal
    'not null' => TRUE,
    'length' => $hossz, // nem minden típusnál
    'default' => $alapertek, // nem kötelező
    'size' => $hossz, // adattípus hossza (nem kötelező),
     'precision' => $p, // csak numerikus mezőknél
    'scale' => $s, // csak numerikus mezőknél
    'serialize' => FALSE,
  ),
);
                              
Típusok
    ●   serial (pg: automatikus sequence, mysql: auto_increment)
    ●   int
    ●   float
    ●   numeric
    ●   varchar
    ●   char
    ●   text
    ●   blob
    ●   datetime
                                      
Opciók
    ●   size: az adattípus mérete ('tiny', 'small', 'medium', 
          'normal', 'big'), lásd: Adattípusok és méreteik
    ●   not null: NULL érték engedélyezése
    ●   default: alapértelmezett érték
    ●   length: hossz a következő típusoknál: 'varchar', 
          'text', 'int'
    ●   unsigned: 'int', 'float', 'numeric' értékeknél érvényes, 
          alapértelmezett: FALSE

                                   
Opciók
    ●   precision, scale: a 'numeric' típusnál a pontosság 
          (szignifikáns bitek száma)
    ●   serialize: boolean érték, hogy a tárolt adat 
          szerializált sztring­e




                                  
Kulcsok megadása
    ●   unique keys, indexes:
             array(
                      'kulcs0' => array('mezo0', 'mezo1'),
                      'kulcs1' => array('mezo3'),
             )
    ●   primary key
             array( 'mezo0', 'mezo1' )




                                         
API

       db_add_field, db_add_index, db_add_primary_key,
    db_add_unique_key, db_change_field, db_create_table,
      db_create_table_sql, db_drop_field, db_drop_index,
             db_drop_primary_key, db_drop_table,
             db_drop_unique_key, db_field_names,
         db_field_set_default, db_field_set_no_default,
    db_rename_table, db_type_map, db_type_placeholder,
    drupal_get_schema, drupal_get_schema_unprocessed,
       drupal_install_schema, drupal_schema_fields_sql,
         drupal_uninstall_schema, drupal_write_record,
            _db_create_field_sql, _db_process_field,
                   _drupal_initialize_schema

                               
Táblafrissítés
    ●   function mymodule_update_6001() {
            $ret = array();
            db_add_field($ret, 'mytable1', 'newcol', array('type' => 'int', 
              'not null' => TRUE));
            $schema['mytable2'] = array(...);
            db_create_table($ret, 'mytable2', $schema['mytable2']);
            db_add_unique_key($ret, 'mytable2', 'mykey', array('field1', 
              'field2'));
            return $ret;
        }
                                        
További tudnivalók
    ●   Primary key nem lehet NULL
    ●   NOT NULL utólagos hozzáadása, alapértelmezett 
         érték nélkül:
             $ret = array();
             db_add_field($ret, 'mytable0', 'col1', array('type' => 
               'text', 'not null' => TRUE, 'initial' => 'start'));




                                    
Típusok
       Field type     PHP types                  Correct          Incorrect
    int             integer       0, 3, 17                 0.5, '0'
    float           float         7, 5.75                  1.24'
    numeric         float         3.14                     2.17'
    datetime        string         '2007-08-26 13:00:00'   Unix timestamp
    varchar         string         '', 'hi mom'            0, 3.14
    text            N/A           none
    serial          N/A           none
    blob            N/A           none




                                              
JOIN
    ●   A direktszorzat nem hatékony
           ●   3 tábla, 1 millió, fél millió és 50 millió rekorddal
    ●   Hatékony (polinom idejű és memóriaigényű) 
         megoldás: JOIN




                                       
JOIN
    ●   (INNER) JOIN
             SELECT * FROM foo JOIN bar ON foo.fid = bar.fid
             SELECT * FROM foo JOIN bar USING (fid)
    ●   LEFT, RIGHT (OUTER) JOIN
             SELECT * FROM foo LEFT JOIN bar ON foo.fid = 
              bar.fid
    ●   NATURAL JOIN
             SELECT * FROM foo NATURAL JOIN bar
    ●   http://en.wikipedia.org/wiki/Join_(SQL)
                                 
Kompatibilis SQL
    ●   Táblanév köré ” ` helyett
    ●   String köré szigorúan '
    ●   Adattörlés egyszerre egy táblából
    ●   MySQL­nél az int és a boolean ugyanaz, 
         Postgres­nél nem!




                               
Kompatibilis SQL
    ●   Kerülni:
           ●   IGNORE
           ●   REPLACE
           ●   ON DUPLICATE KEY
    ●   CONCAT() csak két argumentummal
    ●   Minden nem aggregált mezőnek szerepelnie kell a 
         GROUP BY után
    ●   http://drupal.org/node/555514 

                                
Kérdések




            

More Related Content

Viewers also liked

A testbeszéd
A testbeszédA testbeszéd
A testbeszédnovigi
 
Query Languages for Document Stores
Query Languages for Document StoresQuery Languages for Document Stores
Query Languages for Document StoresInteractiveCologne
 
6 Data Modeling for NoSQL 2/2
6 Data Modeling for NoSQL 2/26 Data Modeling for NoSQL 2/2
6 Data Modeling for NoSQL 2/2Fabio Fumarola
 
SAP HANA Vora SITMTY 20160707
SAP HANA Vora SITMTY 20160707SAP HANA Vora SITMTY 20160707
SAP HANA Vora SITMTY 20160707Henrique Pinto
 
SQL, NoSQL, BigData in Data Architecture
SQL, NoSQL, BigData in Data ArchitectureSQL, NoSQL, BigData in Data Architecture
SQL, NoSQL, BigData in Data ArchitectureVenu Anuganti
 
Query mechanisms for NoSQL databases
Query mechanisms for NoSQL databasesQuery mechanisms for NoSQL databases
Query mechanisms for NoSQL databasesArangoDB Database
 
Introduction to NoSQL Databases
Introduction to NoSQL DatabasesIntroduction to NoSQL Databases
Introduction to NoSQL DatabasesDerek Stainer
 
NoSQL Now! NoSQL Architecture Patterns
NoSQL Now! NoSQL Architecture PatternsNoSQL Now! NoSQL Architecture Patterns
NoSQL Now! NoSQL Architecture PatternsDATAVERSITY
 

Viewers also liked (10)

A testbeszéd
A testbeszédA testbeszéd
A testbeszéd
 
Arckifejezések
ArckifejezésekArckifejezések
Arckifejezések
 
Nosql data models
Nosql data modelsNosql data models
Nosql data models
 
Query Languages for Document Stores
Query Languages for Document StoresQuery Languages for Document Stores
Query Languages for Document Stores
 
6 Data Modeling for NoSQL 2/2
6 Data Modeling for NoSQL 2/26 Data Modeling for NoSQL 2/2
6 Data Modeling for NoSQL 2/2
 
SAP HANA Vora SITMTY 20160707
SAP HANA Vora SITMTY 20160707SAP HANA Vora SITMTY 20160707
SAP HANA Vora SITMTY 20160707
 
SQL, NoSQL, BigData in Data Architecture
SQL, NoSQL, BigData in Data ArchitectureSQL, NoSQL, BigData in Data Architecture
SQL, NoSQL, BigData in Data Architecture
 
Query mechanisms for NoSQL databases
Query mechanisms for NoSQL databasesQuery mechanisms for NoSQL databases
Query mechanisms for NoSQL databases
 
Introduction to NoSQL Databases
Introduction to NoSQL DatabasesIntroduction to NoSQL Databases
Introduction to NoSQL Databases
 
NoSQL Now! NoSQL Architecture Patterns
NoSQL Now! NoSQL Architecture PatternsNoSQL Now! NoSQL Architecture Patterns
NoSQL Now! NoSQL Architecture Patterns
 

More from Tamás Demeter-Haludka (6)

Drupal kurzus security (Drupal 7)
Drupal kurzus security (Drupal 7)Drupal kurzus security (Drupal 7)
Drupal kurzus security (Drupal 7)
 
Dcourse Drupal 6 architecture
Dcourse Drupal 6 architectureDcourse Drupal 6 architecture
Dcourse Drupal 6 architecture
 
Dcourse ctools
Dcourse ctoolsDcourse ctools
Dcourse ctools
 
Dcourse security 2010
Dcourse security 2010Dcourse security 2010
Dcourse security 2010
 
Views
ViewsViews
Views
 
Organic groups
Organic groupsOrganic groups
Organic groups
 

Drupal 6 Database layer

  • 2. Több adatbázis támogatása ● Drupal 6 ● MySQL: támogatott ● PostgreSQL: core támogatja, contribok kevésbé ● MSSQL: a Microsoft nagyon szeretné ● Oracle: contribként elérhető ● Drupal 7 ● MySQL: támogatott ● PostgreSQL: tesztekkel bizonyítottan támogatott    
  • 3. Könnyűsúlyú API ● Előny ● Kevés visszaesés teljesítményben ● Könnyen használható ● Hátrány ● SQL írásakor nagyon figyelni kell a szintaxisra ● Csak olyan funkciókra lehet támaszkodni, amelyek  mindegyik támogatott adatbáziskezelőn elérhetőek    
  • 4. Szintaxis különbség ● Tábla neveket körbe kell venni {}­kkel ● Értékek helyett placeholderek ● Példa SELECT ”name” FROM {users} WHERE uid = %d    
  • 5. Függvények db_add_field, db_add_index, db_add_primary_key, db_add_unique_key, db_affected_rows, db_change_field, db_check_setup, db_column_exists, db_connect, db_create_table, db_create_table_sql, db_decode_blob, db_distinct_field, db_drop_field, db_drop_index, db_drop_primary_key, db_drop_table, db_drop_unique_key, db_encode_blob, db_error, db_escape_string, db_escape_table, db_fetch_array, db_fetch_object, db_field_names, db_field_set_default, db_field_set_no_default, db_is_active, db_last_insert_id, db_lock_table, db_placeholders, db_prefix_tables, db_query, db_query_range, db_query_temporary, db_rename_table, db_result, db_rewrite_sql, db_set_active, db_status_report, db_table_exists, db_type_map, db_type_placeholder, db_unlock_tables, db_version, pager_query, tablesort_sql, update_sql    
  • 6. Példák ● Rossz példa: $res = db_query(”SELECT * FROM {users}  WHERE uid = $uid”);    
  • 7. Példák ● Mi van, ha a valahonnan kapott $uid tartalma a  következő: 1; UPDATE users SET pass = md5('iamhacked')    
  • 8. Akkor bizony  megtörtek :(    
  • 9. Példák ● Az előző példa helyesen $res = db_query(”SELECT * FROM {users}  WHERE uid = %d”, $uid); ● Az uid lehet bármi, a %d miatt numerikus értékké  lesz konvertálva. ● Az előző rosszindulatú paraméter esetén 1 lesz.    
  • 10. String ● String használata $res = db_query(”SELECT uid, name FROM  {users} WHERE name = '%s'”, $searchstring);    
  • 11. További típusok ● Float $res = db_query(”SELECT * FROM {spec_tabla}  WHERE valami_mezo > %F”, $float_ertek);    
  • 12. További típusok ● Bináris $res = db_query(”UPDATE {spec_tabla} SET  valami_adat = %b WHERE id = %d”,  $binaris_adat, $id);    
  • 13. A % escape-elése %% db_query('SELECT nid FROM {node} WHERE  title LIKE '%%%s%%' ORDER BY nid DESC',  $searchstring);    
  • 14. Változó számú érték $data = array(1, 2, 3); db_query('SELECT foo FROM {bar} WHERE  client_id IN (' . db_placeholders($data, 'int') . ')  ORDER BY client_id', $data);    
  • 15. Tábla nevek db_escape_table() db_query('SELECT * FROM {' .  db_escape_table($table) . '}');    
  • 17. Schema API ● Automatikus adatbázisséma generálás ● Biztosan adatbázisfüggetlen lesz a kód, amit generál ● Könnyebb karbantartani ● Könnyen lehet csak egyes részeket felhasználni    
  • 18. hook_schema() ● Használat (.install): mymodule_schema() { $schema = array(...); return $schema; } mymodule_install() { drupal_install_schema('mymodule'); } mymodule_uninstall() { drupal_uninstall_schema('mymodule'); }    
  • 19. Schema tömb array( 'tablaneve' => array( 'fields' => $fields, 'indexes' => $indexes, 'unique keys' => $unique_keys, 'primary key' => $primary_key, ), );    
  • 20. Mezők array( 'mezoneve' => array( 'type' => $tipus, 'unsigned' => TRUE, // csak numerikus típussal 'not null' => TRUE, 'length' => $hossz, // nem minden típusnál 'default' => $alapertek, // nem kötelező 'size' => $hossz, // adattípus hossza (nem kötelező), 'precision' => $p, // csak numerikus mezőknél 'scale' => $s, // csak numerikus mezőknél 'serialize' => FALSE, ), );    
  • 21. Típusok ● serial (pg: automatikus sequence, mysql: auto_increment) ● int ● float ● numeric ● varchar ● char ● text ● blob ● datetime    
  • 22. Opciók ● size: az adattípus mérete ('tiny', 'small', 'medium',  'normal', 'big'), lásd: Adattípusok és méreteik ● not null: NULL érték engedélyezése ● default: alapértelmezett érték ● length: hossz a következő típusoknál: 'varchar',  'text', 'int' ● unsigned: 'int', 'float', 'numeric' értékeknél érvényes,  alapértelmezett: FALSE    
  • 23. Opciók ● precision, scale: a 'numeric' típusnál a pontosság  (szignifikáns bitek száma) ● serialize: boolean érték, hogy a tárolt adat  szerializált sztring­e    
  • 24. Kulcsok megadása ● unique keys, indexes: array( 'kulcs0' => array('mezo0', 'mezo1'), 'kulcs1' => array('mezo3'), ) ● primary key array( 'mezo0', 'mezo1' )    
  • 25. API db_add_field, db_add_index, db_add_primary_key, db_add_unique_key, db_change_field, db_create_table, db_create_table_sql, db_drop_field, db_drop_index, db_drop_primary_key, db_drop_table, db_drop_unique_key, db_field_names, db_field_set_default, db_field_set_no_default, db_rename_table, db_type_map, db_type_placeholder, drupal_get_schema, drupal_get_schema_unprocessed, drupal_install_schema, drupal_schema_fields_sql, drupal_uninstall_schema, drupal_write_record, _db_create_field_sql, _db_process_field, _drupal_initialize_schema    
  • 26. Táblafrissítés ● function mymodule_update_6001() { $ret = array(); db_add_field($ret, 'mytable1', 'newcol', array('type' => 'int',  'not null' => TRUE)); $schema['mytable2'] = array(...); db_create_table($ret, 'mytable2', $schema['mytable2']); db_add_unique_key($ret, 'mytable2', 'mykey', array('field1',  'field2')); return $ret; }    
  • 27. További tudnivalók ● Primary key nem lehet NULL ● NOT NULL utólagos hozzáadása, alapértelmezett  érték nélkül: $ret = array(); db_add_field($ret, 'mytable0', 'col1', array('type' =>  'text', 'not null' => TRUE, 'initial' => 'start'));    
  • 28. Típusok Field type PHP types Correct Incorrect int integer 0, 3, 17 0.5, '0' float float 7, 5.75 1.24' numeric float 3.14 2.17' datetime string '2007-08-26 13:00:00' Unix timestamp varchar string '', 'hi mom' 0, 3.14 text N/A none serial N/A none blob N/A none    
  • 29. JOIN ● A direktszorzat nem hatékony ● 3 tábla, 1 millió, fél millió és 50 millió rekorddal ● Hatékony (polinom idejű és memóriaigényű)  megoldás: JOIN    
  • 30. JOIN ● (INNER) JOIN SELECT * FROM foo JOIN bar ON foo.fid = bar.fid SELECT * FROM foo JOIN bar USING (fid) ● LEFT, RIGHT (OUTER) JOIN SELECT * FROM foo LEFT JOIN bar ON foo.fid =  bar.fid ● NATURAL JOIN SELECT * FROM foo NATURAL JOIN bar ● http://en.wikipedia.org/wiki/Join_(SQL)    
  • 31. Kompatibilis SQL ● Táblanév köré ” ` helyett ● String köré szigorúan ' ● Adattörlés egyszerre egy táblából ● MySQL­nél az int és a boolean ugyanaz,  Postgres­nél nem!    
  • 32. Kompatibilis SQL ● Kerülni: ● IGNORE ● REPLACE ● ON DUPLICATE KEY ● CONCAT() csak két argumentummal ● Minden nem aggregált mezőnek szerepelnie kell a  GROUP BY után ● http://drupal.org/node/555514