# 模式定义语言

> 原文： [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 教程的这一部分专门用于架构元数据。