用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 just employees.c.employee_id # via string employees.c['employee_id'] # iterate through all columns for c in employees.c: print c # get the table's primary key columns for 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 key employees.c.employee_id.name employees.c.employee_id.type employees.c.employee_id.nullable employees.c.employee_id.primary_key employees.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 key list(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