使用sqlalchemy的'engine_from_config'

the*_*hey 4 database constructor sqlalchemy python-2.7

我试图在类的构造函数中使用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
Run Code Online (Sandbox Code Playgroud)

但是在教程中,我读到了实现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)
Run Code Online (Sandbox Code Playgroud)

我想我可能会考虑这个问题,或者稍后可能是一个名为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)
Run Code Online (Sandbox Code Playgroud)

新问题: 我是否必须返回会话?另外,我的初始化构造函数中是否不需要调用“ create_engine” ?我将其保存在另一个文件中,我相信这就是为什么它起作用的原因。

小智 5

我将执行以下操作。使用较短的前缀,例如“ db。”。不要忘了最后的圆点。prefix ='sqlalchemy'。是默认值,因此您不必在代码中编写它。这对于s​​essionmaker省略的参数也有效。

config = {'db.url':'sqlite:///./somedb.db', 'db.echo':'True'}
self.engine = engine_from_config(config, prefix='db.')
Session = sessionmaker(bind=engine)
Run Code Online (Sandbox Code Playgroud)

您应该使用

Base.metadata.create_all(bind=engine)
Run Code Online (Sandbox Code Playgroud)

如果要sqlalchemy为您创建表。如果数据库存在,则应使用engine_from_config。

希望对您有所帮助。