我使用SQLAlchemy声明性方法生成了所有表,例如,每个表类扩展了一个Base类,如下所示:
class Base(object):
@declared_attr
def __tablename__(cls):
return str(cls.__name__)
id = Column(Integer, primary_key=True, nullable = False)
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base(cls=Base)
我希望能够打开我保存的数据库 - 因为我已经生成了所有表,我不想使用声明或自动表生成的反射。我在这里找到的唯一文档就是:http://www.blog.pythonlibrary.org/2010/09/10/sqlalchemy-connecting-to-pre-existing-databases/ - 特别是“使用声明式样式明确定义数据库”部分,其中定义了一个init方法:
def __init__(self, id, url, title, rev_host, visit_count,
hidden, typed, favicon_id, frecency, last_visit_date):
self.id = id
#etc
使用此方法获取会话的位置:
def loadSession():
metadata = Base.metadata
Session = sessionmaker(bind=engine)
session = Session()
return session
这是最好的方法 - 为每个表类创建一个 init 方法,并定义每个数据库字段吗?
然后我不确定如何集成获取会话,我现有的DBManager类是创建新数据库并使用以下方式获取会话:
host= db_path + db_name
def init_db(self):
#import table classes here
self.engine = create_engine(self.host, echo=False)
self.base = Base()
self.base.metadata.create_all(bind=self.engine)
def getSession(self):
if self.ready():
Session.configure(bind=self.engine)
session = Session()
return session
else:
return None
例如我可以拥有某种全局标志 - 如果DB是使用方法a的现有get会话,如果新数据库使用方法b获得会话?有关最佳做法的指南吗?