用MetaData描述数据库

这节讨论基本的Table,Column,MetaData对象。

from sqlalchemy import *metadata = MetaData()

MetaData 是一个容器对象,包含了许多描述数据库的特征。

可以用Table 类来描绘一个表,它的前两个参数是表名和关联的MetaData对象。剩下的参数大部分是Column 对象用来描述列。

user = Table('user', metadata,    Column('user_id', Integer, primary_key = True),    Column('user_name', String(16), nullable = False),    Column('email_address', String(60)),    Column('password', String(20), nullable = False))

上面的例子中,一个user表就被描述了。如果要描述复合主键,可以在多个列后面加上primary_key = True。

访问表和列

metadata 包含所有关联过它的schema的结构。它有一些方法去访问这些表对象的属性,比如sorted_tables 属性可以返回所有关联的表对象,按照外键关联排序(每个表对象优先于它关联的任何其他表)

>>> for t in metadata.sorted_tables:...                print t.name user user_preference invoice invoice_item

下面来举例说明表定义和属性的访问

employees = Table('employees', metadata,    Column('employee_id', Integer, primary_key=True),    Column('employee_name', String(60), nullable=False),    Column('employee_dept', Integer, ForeignKey("departments.department_id")))

可访问的属性如下:

# access the column "EMPLOYEE_ID":employees.columns.employee_id# or justemployees.c.employee_id# via stringemployees.c['employee_id']# iterate through all columnsfor c in employees.c:    print c# get the table's primary key columnsfor primary_key in employees.primary_key:    print primary_key    # get the table's foreign key objects:for fkey in employees.foreign_keys:    print fkey# access the table's MetaData:employees.metadata# access the table's bound Engine or Connection, if its MetaData is bound:employees.bind# access a column's name, type, nullable, primary key, foreign keyemployees.c.employee_id.nameemployees.c.employee_id.typeemployees.c.employee_id.nullableemployees.c.employee_id.primary_keyemployees.c.employee_dept.foreign_keys# get the "key" of a column, which defaults to its name, but can# be any user-defined string:employees.c.employee_name.key# access a column's table:employees.c.employee_id.table is employees# get the table related by a foreign keylist(employees.c.employee_dept.foreign_keys)[0].column.table

创建和删除数据库表

通常的创建表的方法是在MetaData对象上用create_all()方法。这个方法会先检查是否存在该表,不存在则创建。

 engine = create_engine('sqlite:///:memory:')  metadata = MetaData()  user = Table('user', metadata,        Column('user_id', Integer, primary_key = True),        Column('user_name', String(16), nullable = False),        Column('email_address', String(60), key='email'),        Column('password', String(20), nullable = False)    )    user_prefs = Table('user_prefs', metadata,        Column('pref_id', Integer, primary_key=True),        Column('user_id', Integer, ForeignKey("user.user_id"), nullable=False),        Column('pref_name', String(40), nullable=False),        Column('pref_value', String(100))    )        metadata.create_all(engine)

create_all()方法创建外键关联通常是与创建表的同时,所以它会按照依赖关系来创建表。也有方法来改变这种行为,比如later table 就可以。

删除多有表一般用drop_all()方法。这个方法和create_all()正好相反,先检查依赖关系,然后按照相反的顺序来删除表。

创建和删除单个的表可以用create()和drop()方法。

    engine = create_engine('sqlite:///:memory:')    meta = MetaData()    employees = Table('employees', meta,        Column('employee_id', Integer, primary_key=True),        Column('employee_name', String(60), nullable=False, key='name'),        Column('employee_dept', Integer, ForeignKey("departments.department_id"))    )    employees.create(engine)    employees.drop(engine)

如果要开启'检查表是否存在'这个逻辑,可以用checkfirst = True参数

employees.create(engine, checkfirst=True)employees.drop(engine, checkfirst=False)

指定后端(数据库引擎)

addresses = Table('engine_email_addresses', meta,    Column('address_id', Integer, primary_key = True),    Column('remote_user_id', Integer, ForeignKey(users.c.user_id)),    Column('email_address', String(20)), mysql_engine='InnoDB')

列/表/MetaData 的API接口不再翻译,请自行查阅

http://docs.sqlalchemy.org/en/latest/core/metadata.html