SQLAlchemy最佳实践:何时/如何配置scoped_session?

舍甫隆

我试图找出一种以“正确的方式”使用SQLAlchemy范围的会话的正确方法,同时保持将会话的逻辑与配置分开并且与使用会话分开的逻辑。有人多次告诉我,一个好方法是拥有一些我可以在任何地方使用的全局scoped_session工厂:

"""myapp/db.py
"""

from sqlalchemy.orm import sessionmaker, scoped_session

Session = scoped_session(sessionmaker())

然后,当我想使用它时:

"""myapp/service/dosomething.py
"""

from myapp.db import Session

def do_something(data): 
    """Do something with data
    """
    session = Session()
    bars = session.query(Bar).all()
    for bar in bars:
        bar.data = data
    session.commit()

这似乎是正确的,但是我的问题是,在我所看到的所有示例中,它sessionmaker还会设置会话的某些参数,即最重要的是绑定引擎。这对我来说毫无意义,因为实际的数据库引擎将在myapp.db模块导入期间根据全局范围内未知的配置创建

我所要做的是在应用程序的“ main”(或线程的main函数)中设置所有内容,然后仅假设该会话在其他位置进行了配置(例如,在do_something()上述位置使用):

"""myapp/main.py
"""

from sqlalchemy import create_engine
from myapp.db import Session
from myapp.service.dosomething import do_something

def main(): 
    config = load_config_from_file()
    engine = create_engine(**config['db'])
    Session.configure(bind=engine)

    do_something(['foo', 'bar'])

这看起来像是正确的方法吗?我还没有找到这种流程的任何好例子,但我发现大多数其他例子似乎过于简化或特定于框架。

舍甫隆

这是旧的,我从未接受过以下任何答案,但是在各种项目中,@ univerio的评论不断涌现,并且在SQLAlchemy中连续使用了3年以上,我现在选择的方法是继续按照我在OP中的建议进行操作:

  1. 创建一个myapp.db定义以下内容模块Session = ScopedSession(sessionmaker())
  2. 导入from myapp.db import Session所需的任何地方
  3. 在我的应用程序main或相关的初始化代码中,执行以下操作:
def main(): 
     config = load_config_from_file()
     engine = create_engine(**config['db'])
     Session.configure(bind=engine)

     do_something(['foo', 'bar'])

我已经在Web应用程序,命令行工具和长期运行的后端流程中成功使用了这种模式,到目前为止,无需更改它。Ot很简单,可重用并且效果很好,我建议所有在这里绊脚的人都推荐它,因为他们问自己和我三年前一样。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

SQLAlchemy最佳实践:何时/如何配置scoped_session?

来自分类Dev

在python asyncio中正确使用sqlalchemy scoped_session

来自分类Dev

SQLAlchemy scoped_session和“已附加”错误

来自分类Dev

SQLAlchemy scoped_session和“已附加”错误

来自分类Dev

SQLAlchemy, scoped_session - raw SQL INSERT doesn't write to DB

来自分类Dev

在 scoped_session 中跨越进程边界

来自分类Dev

Flask错误:db:scoped_session'scoped_session'的实例没有'commit'memberpylint(no-member)

来自分类Dev

AttributeError:“ scoped_session”对象没有属性“ session”

来自分类Dev

'scoped_session'对象没有属性'create_all''scoped_session'对象没有属性'session'

来自分类Dev

如何实现sqlalchemy.orm.scoping.scoped_session代理功能?

来自分类Dev

最佳实践:何时返回404未找到

来自分类Dev

为什么我的scoped_session引发AttributeError:“会话”对象没有属性“删除”

来自分类Dev

Spring NON MVC项目配置-最佳实践

来自分类Dev

分离配置和算法代码的最佳实践

来自分类Dev

Spring NON MVC项目配置-最佳实践

来自分类Dev

确定何时调整画布大小的最佳实践是什么?

来自分类Dev

检测何时“用户正在键入”聊天功能的最佳实践?

来自分类Dev

如何从Vaadin UI建模POJO?(最佳实践)

来自分类Dev

如何登录网页项目?最佳实践

来自分类Dev

PHP OOP最佳实践或如何正确编码?

来自分类Dev

PHP OOP最佳实践或如何正确编码?

来自分类Dev

关于如何组织方法的最佳实践?

来自分类Dev

RESTful最佳实践-如何命名报告资源

来自分类Dev

通过注解而不是XML配置Spring LdapTemplate的最佳实践?

来自分类Dev

最佳实践-Git +构建自动化-分开配置

来自分类Dev

在wordpress中更改主机时配置的最佳实践是什么?

来自分类Dev

最佳实践:具有各种配置类类型的类系列

来自分类Dev

应该将配置内置到Docker映像中(最佳实践)

来自分类Dev

最佳实践-Git +构建自动化-将配置分开

Related 相关文章

  1. 1

    SQLAlchemy最佳实践:何时/如何配置scoped_session?

  2. 2

    在python asyncio中正确使用sqlalchemy scoped_session

  3. 3

    SQLAlchemy scoped_session和“已附加”错误

  4. 4

    SQLAlchemy scoped_session和“已附加”错误

  5. 5

    SQLAlchemy, scoped_session - raw SQL INSERT doesn't write to DB

  6. 6

    在 scoped_session 中跨越进程边界

  7. 7

    Flask错误:db:scoped_session'scoped_session'的实例没有'commit'memberpylint(no-member)

  8. 8

    AttributeError:“ scoped_session”对象没有属性“ session”

  9. 9

    'scoped_session'对象没有属性'create_all''scoped_session'对象没有属性'session'

  10. 10

    如何实现sqlalchemy.orm.scoping.scoped_session代理功能?

  11. 11

    最佳实践:何时返回404未找到

  12. 12

    为什么我的scoped_session引发AttributeError:“会话”对象没有属性“删除”

  13. 13

    Spring NON MVC项目配置-最佳实践

  14. 14

    分离配置和算法代码的最佳实践

  15. 15

    Spring NON MVC项目配置-最佳实践

  16. 16

    确定何时调整画布大小的最佳实践是什么?

  17. 17

    检测何时“用户正在键入”聊天功能的最佳实践?

  18. 18

    如何从Vaadin UI建模POJO?(最佳实践)

  19. 19

    如何登录网页项目?最佳实践

  20. 20

    PHP OOP最佳实践或如何正确编码?

  21. 21

    PHP OOP最佳实践或如何正确编码?

  22. 22

    关于如何组织方法的最佳实践?

  23. 23

    RESTful最佳实践-如何命名报告资源

  24. 24

    通过注解而不是XML配置Spring LdapTemplate的最佳实践?

  25. 25

    最佳实践-Git +构建自动化-分开配置

  26. 26

    在wordpress中更改主机时配置的最佳实践是什么?

  27. 27

    最佳实践:具有各种配置类类型的类系列

  28. 28

    应该将配置内置到Docker映像中(最佳实践)

  29. 29

    最佳实践-Git +构建自动化-将配置分开

热门标签

归档