模式定义语言
最后修改于 2020 年 7 月 6 日
在本 SQLAlchemy 教程中,我们将介绍 SQLAlchemy 的模式定义语言。
SQLAlchemy 的模式元数据是描述和检查数据库模式的综合系统。 SQLAlchemy 查询和对象映射操作的核心由数据库元数据支持。
元数据是关于数据库中数据的信息;例如,关于我们存储数据的表和列的信息。
表示一个表
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
在示例中,我们使用模式定义语言来描述一个简单的表。
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
中的任何表创建 Table
条目。
#!/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
方法创建。
#!/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 教程的这一部分专门介绍了模式元数据。