SQLAlchemy 文檔翻譯(2)

用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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章