模式定义语言
在 SQLAlchemy 教程的这一部分中,我们描述了 SQLAlchemy 的模式定义语言。
SQLAlchemy 模式元数据是一个描述和检查数据库模式的综合系统。 数据库元数据支持 SQLAlchemy 的查询和对象映射操作的核心。
元数据是有关数据库中数据的信息。 例如有关存储数据的表和列的信息。
Table
Table
类用于表示数据库表。
schema.py
#!/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
在示例中,我们使用架构定义语言来描述一个简单的表。
from sqlalchemy import (create_engine, Table, Column, Integer,
String, MetaData)
Table
,Column
,Integer
,String
和MetaData
是表定义所需的类。
meta = MetaData()
MetaData
是Table
对象的容器,以及到引擎或连接的可选绑定。
cars = Table('Cars', meta,
Column('Id', Integer, primary_key=True),
Column('Name', String),
Column('Price', Integer)
)
我们创建Cars
表的元数据定义。 该表具有三列,由Column
类定义。 列的数据类型由Integer
和String
类定义。
print cars.columns.Name
print cars.c.Name
我们访问Name
列。 这些列可通过columns
或c
属性使用。
for col in cars.c:
print col
在此for
循环中,我们打印表的所有列名。
for pk in cars.primary_key:
print pk
我们在表中打印主键。
print cars.c.Id.name
print cars.c.Id.type
print cars.c.Id.nullable
print cars.c.Id.primary_key
在这里,我们打印Id
列的四个属性:其名称,类型,是否可为空以及是否具有主键。
$ ./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
这是示例的输出。
reflect()
方法
reflect()
方法为数据库中可用但尚未出现在MetaData
中的任何表自动在MetaData
对象中创建Table
条目。
schema_reflect.py
#!/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
在示例中,我们使用reflect()
方法来打印数据库中的所有表名。
meta = MetaData()
meta.reflect(bind=eng)
reflect()
方法绑定到创建的引擎。 MetaData
充满了Table
对象。
for table in meta.tables:
print table
可通过tables
属性访问Table
对象,该属性是Table
对象的字典。 表名是字典的键。
$ ./schema_reflect.py
Images
Cars
Books
Testing
Authors
这是示例的输出。
检查器
检查器执行低级数据库模式检查。 使用inspect()
方法创建一个检查器。
schema_inspector.py
#!/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()
在示例中,我们使用检查器进行了一些元数据反射。
insp = inspect(eng)
检查器对象是使用inspect()
方法创建的。 该方法以引擎为参数。
print insp.get_table_names()
get_table_names()
获取可用表的名称。
print insp.get_columns("Cars")
get_columns()
获取Cars
表的列的名称。
print insp.get_primary_keys("Cars")
get_primary_keys()
获取Cars
表的主键。
print insp.get_schema_names()
get_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']
这是示例的输出。
SQLAlchemy 教程的这一部分专门用于架构元数据。