Schema Definition Lanuage
last modified July 6, 2020
In this part of the SQLAlchemy tutorial, we describe the Schema Definition Language of SQLAlchemy.
SQLAlchemy schema metadata is a comprehensive system of describing and inspecting database schemas. The core of SQLAlchemy's query and object mapping operations is supported by database metadata.
Metadata is information about the data in the database; for instance information about the tables and columns, in which we store data.
Representing a table
The Table
class is used to represent a database
table.
#!/usr/bin/python # -*- coding: utf-8 -*- from sqlalchemy import (create_engine, Table, Column, Integer, String, MetaData) meta = MetaData() cars = Table('Cars', meta, Column('Id', Integer, primary_key=True), Column('Name', String), Column('Price', Integer) ) print "The Name column:" print cars.columns.Name print cars.c.Name print "Columns: " for col in cars.c: print col print "Primary keys:" for pk in cars.primary_key: print pk print "The Id column:" print cars.c.Id.name print cars.c.Id.type print cars.c.Id.nullable print cars.c.Id.primary_key
In the example, we use the Schema Definition Language to describe a simple table.
from sqlalchemy import (create_engine, Table, Column, Integer, String, MetaData)
The Table
, Column
, Integer
,
String
, and MetaData
are classes needed for
the table definition.
meta = MetaData()
The MetaData
is a container of Table
objects
as well as an optional binding to an engine or connection.
cars = Table('Cars', meta, Column('Id', Integer, primary_key=True), Column('Name', String), Column('Price', Integer) )
We create a metadata definition of a Cars table. The table
has three columns, defined with the Column
class.
The datatypes of columns are defined with the Integer
and String
classes.
print cars.columns.Name print cars.c.Name
We access the Name
column. The columns are available through
the columns
or c
property.
for col in cars.c: print col
In this for loop, we print all the column names of the table.
for pk in cars.primary_key: print pk
We print primary keys in the table.
print cars.c.Id.name print cars.c.Id.type print cars.c.Id.nullable print cars.c.Id.primary_key
Here we print four properties of the Id
column:
its name, type, whether it is nullable and whether
it has a primary key.
$ ./schema.py The Name column: Cars.Name Cars.Name Columns: Cars.Id Cars.Name Cars.Price Primary keys: Cars.Id The Id column: Id INTEGER False True
This is the output of the example.
The reflect() method
The reflect
method automatically creates Table
entries in
the MetaData
object for any table available in the database but not yet
present in the MetaData
.
#!/usr/bin/python # -*- coding: utf-8 -*- from sqlalchemy import (create_engine, Table, Column, Integer, String, MetaData) eng = create_engine("mysql://testuser:test623@localhost/testdb") meta = MetaData() meta.reflect(bind=eng) for table in meta.tables: print table
In the example, we use the reflect
method to print
all the table names in the database.
meta = MetaData() meta.reflect(bind=eng)
The reflect
method is bound to the created engine.
The MetaData
is filled with Table
objects.
for table in meta.tables: print table
The Table
objects are accessible through tables
property, which is a dictionary of Table
objects. The table
names are keys of the dictionary.
$ ./schema_reflect.py Images Cars Books Testing Authors
This is the output of the example.
Inspector
The Inspector performs low-level database schema inspection.
An Inspector is created with the inspect
method.
#!/usr/bin/python # -*- coding: utf-8 -*- from sqlalchemy import create_engine, inspect eng = create_engine("mysql://testuser:test623@localhost/testdb") insp = inspect(eng) print insp.get_table_names() print insp.get_columns("Cars") print insp.get_primary_keys("Cars") print insp.get_schema_names()
In the example, we do some metadata reflection using the inspector.
insp = inspect(eng)
The inspector object is created with the inspect
method.
The method takes an engine as a parameter.
print insp.get_table_names()
The get_table_names
gets the names of the available
tables.
print insp.get_columns("Cars")
The get_columns
gets the names of the columns
of the Cars
table.
print insp.get_primary_keys("Cars")
The get_primary_keys
gets the primary keys
of the Cars
table.
print insp.get_schema_names()
The get_schema_names
returns all the schema names.
$ ./schema_inspector.py [u'Authors', u'Books', u'Cars', u'Images', u'Testing'] [{'default': None, 'autoincrement': False, 'type': INTEGER(display_width=11), 'name': u'Id', 'nullable': False}, {'default': None, 'type': TEXT(), 'name': u'Name', 'nullable': True}, {'default': None, 'autoincrement': False, 'type': INTEGER(display_width=11), 'name': u'Price', 'nullable': True}] [u'Id'] ['information_schema', 'testdb']
This is the output of the example.
This part of the SQLAlchemy tutorial was dedicated to schema metadata.