ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 模式定义语言 > 原文: [http://zetcode.com/db/sqlalchemy/schema/](http://zetcode.com/db/sqlalchemy/schema/) 在 SQLAlchemy 教程的这一部分中,我们描述了 SQLAlchemy 的模式定义语言。 SQLAlchemy 模式元数据是一个描述和检查数据库模式的综合系统。 数据库元数据支持 SQLAlchemy 的查询和对象映射操作的核心。 元数据是有关数据库中数据的信息。 例如有关存储数据的表和列的信息。 ## `Table` `Table`类用于表示数据库表。 `schema.py` ```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 ``` 在示例中,我们使用架构定义语言来描述一个简单的表。 ```py from sqlalchemy import (create_engine, Table, Column, Integer, String, MetaData) ``` `Table`,`Column`,`Integer`,`String`和`MetaData`是表定义所需的类。 ```py meta = MetaData() ``` `MetaData`是`Table`对象的容器,以及到引擎或连接的可选绑定。 ```py cars = Table('Cars', meta, Column('Id', Integer, primary_key=True), Column('Name', String), Column('Price', Integer) ) ``` 我们创建`Cars`表的元数据定义。 该表具有三列,由`Column`类定义。 列的数据类型由`Integer`和`String`类定义。 ```py print cars.columns.Name print cars.c.Name ``` 我们访问`Name`列。 这些列可通过`columns`或`c`属性使用。 ```py for col in cars.c: print col ``` 在此`for`循环中,我们打印表的所有列名。 ```py for pk in cars.primary_key: print pk ``` 我们在表中打印主键。 ```py print cars.c.Id.name print cars.c.Id.type print cars.c.Id.nullable print cars.c.Id.primary_key ``` 在这里,我们打印`Id`列的四个属性:其名称,类型,是否可为空以及是否具有主键。 ```py $ ./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` ```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()`方法来打印数据库中的所有表名。 ```py meta = MetaData() meta.reflect(bind=eng) ``` `reflect()`方法绑定到创建的引擎。 `MetaData`充满了`Table`对象。 ```py for table in meta.tables: print table ``` 可通过`tables`属性访问`Table`对象,该属性是`Table`对象的字典。 表名是字典的键。 ```py $ ./schema_reflect.py Images Cars Books Testing Authors ``` 这是示例的输出。 ## 检查器 检查器执行低级数据库模式检查。 使用`inspect()`方法创建一个检查器。 `schema_inspector.py` ```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() ``` 在示例中,我们使用检查器进行了一些元数据反射。 ```py insp = inspect(eng) ``` 检查器对象是使用`inspect()`方法创建的。 该方法以引擎为参数。 ```py print insp.get_table_names() ``` `get_table_names()`获取可用表的名称。 ```py print insp.get_columns("Cars") ``` `get_columns()`获取`Cars`表的列的名称。 ```py print insp.get_primary_keys("Cars") ``` `get_primary_keys()`获取`Cars`表的主键。 ```py print insp.get_schema_names() ``` `get_schema_names()`返回所有模式名称。 ```py $ ./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 教程的这一部分专门用于架构元数据。