ZetCode

模式定义语言

最后修改于 2020 年 7 月 6 日

在本 SQLAlchemy 教程中,我们将介绍 SQLAlchemy 的模式定义语言。

SQLAlchemy 的模式元数据是描述和检查数据库模式的综合系统。 SQLAlchemy 查询和对象映射操作的核心由数据库元数据支持。

元数据是关于数据库中数据的信息;例如,关于我们存储数据的表和列的信息。

表示一个表

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)

TableColumnIntegerStringMetaData 是表定义所需的类。

meta = MetaData()

MetaDataTable 对象的容器,也是一个可选的到引擎或连接的绑定。

cars = Table('Cars', meta,
     Column('Id', Integer, primary_key=True),
     Column('Name', String),
     Column('Price', Integer)
)

我们创建了一个 Cars 表的元数据定义。该表有三列,使用 Column 类定义。 列的数据类型使用 IntegerString 类定义。

print cars.columns.Name
print cars.c.Name

我们访问 Name 列。 这些列可以通过 columnsc 属性获得。

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 中的任何表创建 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

Table 对象可以通过 tables 属性访问,它是一个 Table 对象的字典。表名是字典的键。

$ ./schema_reflect.py 
Images
Cars
Books
Testing
Authors

这是示例的输出。

Inspector

Inspector 执行低级数据库模式检查。 Inspector 使用 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()

在示例中,我们使用 Inspector 做一些元数据反射。

insp = inspect(eng)

inspector 对象使用 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 教程的这一部分专门介绍了模式元数据。