我正在尝试在类的构造函数中使用engine_from_config()。互联网上的教程和材料令人困惑。我是新手,并且一直在努力解决看似简单的任务。在构造函数中实现.engine_from_config()的任何帮助都非常感谢!
这对我有意义:
class BaseAPI(object):
_userclass = None
_userassessment = None
def __init__(self, config, prefix='sqlalchemy.', **kwargs):
assert self_userclass is not None
config = {'sqlalchemy.url':
'sqlite:///./somedb.db', 'sqlalchemy.echo':'True'}
self.engine = sqlalchemy.engine_from_config(config)
dbSession = scoped_session(sessionmaker(autoflush = True,
autocommit = False,
bind = engine))
Base.metadata.create_all(bind=engine)
print('--start DB Session--')
return dbSession
但是在教程中我读到了实现 sqlalchemy.engine_from_config 的方法是这样的:
options = dict((key[len(prefix):], configuration[key])
for key in configuration
if key.startswith(prefix))
options['_coerce_config'] = True
options.update(kwargs)
url = options.pop('db')
return create_engine(url, **options)
我想我可能会过度思考这个问题,或者后者可能是一个名为sqlalchemy.engine_from_config的实际类....为什么我的代码不适合我?
新工作变更:
class BaseAPI(object):
def __init__(self):
config = {'sqlalchemy.url':'sqlite:///./somedb.db', 'sqlalchemy.echo':'True'}
self.engine = engine_from_config(config, prefix='sqlalchemy.')
Session = sessionmaker(autoflush=True,autocommit=False,bind=engine)
self.session = Session()
Base.metadata.create_all(bind=engine)
新问题: 我必须退回会议吗?另外,我不应该在 init 构造函数中调用'create_engine'吗?我把它放在另一个文件中,我相信这就是为什么这个有效。
答案 0 :(得分:5)
我会做以下事情。使用较短的前缀,例如' db。'。不要忘记最后的点。前缀=' SQLAlchemy的&#39。是默认值,因此您不必在代码中编写它。这对于sessionmaker的省略参数也有效。
config = {'db.url':'sqlite:///./somedb.db', 'db.echo':'True'}
self.engine = engine_from_config(config, prefix='db.')
Session = sessionmaker(bind=engine)
你应该使用
Base.metadata.create_all(bind=engine)
如果你想sqlalchemy为你创建表格。如果数据库存在,则应使用engine_from_config。
我希望它有所帮助。