【问题标题】:Python - SQLAlchemy multiple sessionsPython - SQLAlchemy 多个会话
【发布时间】:2020-09-05 00:22:08
【问题描述】:

我正在开发一个使用 SQLAlchemy 读取/写入 MySQL 数据库的系统。我有一个工厂,它创建了多个存储库,每个存储库都有自己的会话。我阅读了 os SQLAlchemy 的文档,它指出不同进程不应使用一个会话。

我不能使用相同的会话,因为代码将在不同的机器上运行。

我的问题是,进行不同的会话是一种好习惯吗?会不会有并发问题或竞争?

示例: 如果我有 2 个会话将多条记录写入数据库,并且记录发生冲突。 session.commit() 会中止一切吗?

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    SQLAlchemy 会话是轻量级对象,因此创建多个会话并不麻烦,而且在使用多个进程或多个线程时必须使用多个会话,因为会话不能在进程之间或线程之间共享。

    如果 2 个会话之间发生冲突,则冲突将在 session.commit 或 session autocommit 上引发,具体取决于会话配置。

    最好使用带有事务的会话来确保原子性:

    session = get_session()
    with session.begin():
        session.add(db_obj0)
        session.add(db_obj1)
    

    db_obj0db_obj1 都将被创建或不创建。

    【讨论】:

    • 谢谢!我没有使用事务,因为我需要以最好的方式确保所有内容都写入数据库,如果失败,我希望不创建最少数量的对象。例如,我正在嗅探数据包并存储它们。
    • 仅供参考,现代实现不需要session.begin(): docs.sqlalchemy.org/en/13/orm/…
    猜你喜欢
    • 2013-08-24
    • 2018-02-08
    • 1970-01-01
    • 2023-04-10
    • 2021-11-27
    • 1970-01-01
    • 2023-03-25
    • 2013-08-26
    相关资源
    最近更新 更多