2012-01-18 44 views
1

我有這個類,我用它來創建和管理一個SQLite數據庫:PyQt,SQLAlchemy - 哪些會話適合?

def __init__(self, db_file = None, parent = None): 

    self.db = None 
    self.db_connection = None 
    self.db_file = str(db_file) 

def db_open(self): 
    self.db = create_engine('sqlite:///' + self.db_file) 
    self.db_connection = self.db.connect() 

def db_close(self): 
    self.db_connection.close() 

def db_create_voltdrop(self): 
    metadata = MetaData() 

    tb_cable_brands = Table('cable_brands', metadata, 
     Column('id', Integer, primary_key=True), 
     Column('brand', String) 
     ) 
    tb_cable_types = Table('cable_types', metadata, 
     Column('id', Integer, primary_key=True), 
     Column('brand_id', None, ForeignKey('cable_brands.id')), 
     Column('type', String), 
     Column('alpha', String) 
     ) 
    tb_cable_data = Table('cable_data', metadata, 
     Column('id', Integer, primary_key=True), 
     Column('type_id', None, ForeignKey('cable_types.id')), 
     Column('size', String), 
     Column('resistance', Float) 
     ) 
    metadata.create_all(self.db) 

我實例化這個類我的主窗口打開時,使用DB和關閉數據庫的程序退出時。

我剛開始學習SQLAlchemy。該代碼工作正常。然後我遇到了SQLAlchemy中的會話,這些會話也用於創建和管理數據庫。哪種方法更好?會議對上述方式有什麼優勢?謝謝。

回答

2

會話管理的最佳實踐是在全局範圍內聲明並使用它。

在SQLAlchemy中給出的醫生說

When you write your application, place the result of the sessionmaker() call at the global level. The resulting Session class, configured for your application, should then be used by the rest of the applcation as the source of new Session instances.

所以,你必須在任何包層會話創建。你可以參考this link

2

簡短的回答:您的例子(create_all發出的DDL)它是不是真的很重要(我甚至不知道SA支持DDL交易),但每當你添加/刪除/修改/查詢對象本身,會議是要走的路。有關更多信息,請參閱Using the Sessions

更多信息: 從技術上講,以下聲明不正確:... then I came across sessions in SQLAlchemy which are also *used to create and manage databases*
會話不用於創建和管理數據庫,而是用於爲數據庫操作提供UnitOfWork模式。
一個簡單的視圖是將會話視爲SQL事務:SA對SA對象的會話是SQL事務對DML(數據修改)語句的內容。您的特例是生成DDL語句(數據定義),許多RDBMS甚至不支持DDL事務(您不能回滾CREATE TABLE語句,但應該使用DROP TABLE來取消您的工作)。