我有这个类用于创建和管理SQLIte数据库:
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)
当我的MainWindow打开时,我实例化这个类,使用数据库并在程序退出时关闭数据库。
我刚开始学习SQLAlchemy。该代码工作正常。然后我遇到了SQLAlchemy中的会话,这些会话也用于创建和管理数据库。哪种方式更好?会话对上述方式有什么好处?谢谢。
答案 0 :(得分: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。
答案 1 :(得分:2)
简短回答:为您的示例(其中create_all
发布DDL)它并不重要(我甚至不确定SA是否支持DDL事务),但每当您添加/删除/修改/查询对象本身,Sessions是要走的路。有关详细信息,请参阅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
取消您的工作。)