如何使用 SQLAlchemy 插入数据

Posted

技术标签:

【中文标题】如何使用 SQLAlchemy 插入数据【英文标题】:How to insert data with SQLAlchemy 【发布时间】:2021-12-17 10:19:46 【问题描述】:

我无法使用 SQLAlchemy 将数据插入数据库。 我将 scoped_session 与上下文管理器(类实现)一起使用:

class Session:
    def __init__(self):
        pass

    def __enter__(self):
        engine = create_engine("sqlite:///test.db", echo = True)
        self.connection = engine.connect()
        self.session = scoped_session(\
                sessionmaker(\
                autocommit=True,\
                autoflush=False,\
                bind=engine))
        return self.session

    def __exit__(self, type, value, traceback):
        self.session.close()
        self.connection.close()

我的插入函数:

def insert_value(a, b, c)
    with db_session() as db:
        db.add(Value(a = a, b = b, c = c))

即使在提交之后,该值也没有正确添加到数据库中,但由于某种原因,它适用于 query().filter().update()

db.add() 不会产生任何日志,SQLAlchemy 的文档也无济于事。

编辑: 问题在于db.add(),因为选择、更新和删除操作是通过查询完成的(例如db.query().all()db.query().values()db.query().delete())并且工作正常。

编辑 2: 关于我如何实例化类和引擎的一些精确度

Base = declarative_base()

class Value(Base):
    __tablename__ = "values"

    a = ...
    b = ...
    c = ...

Base.metadata.create_all(create_engine(...))

【问题讨论】:

【参考方案1】:

https://docs.sqlalchemy.org/en/14/orm/session_transaction.html

根据上述文档,我猜autocommit 已被弃用。他们现在有一个 session.begin() 方法用于自动提交。

所以你可以这样使用它:

with db_session.begin():
      foo

【讨论】:

我认为问题不在于自动提交,因为它与更新或删除完美配合。 Session.begin() 没有做任何不同的事情。 SQLAlchemy 文档只是一团糟。【参考方案2】:

我解决了这个问题。

我认为问题的原因是:

自动提交的使用 我启动了两次引擎,一次用于 Session,一次用于基类。
engine = create_engine(...) // Initiated once and for all

Base = declarative_base()

class Value(Base):
    __tablename__ = "values"

    a = ...
    b = ...
    c = ...

Base.metadata.create_all(engine)

class DbSession:
    def __init__(self):
        pass

    def __enter__(self):
        self.connection = engine.connect() // Reuse the engine instead of creating a new one
        self.session = scoped_session(\
                sessionmaker(\
                autocommit=False,\
                autoflush=False,\
                bind=engine))
        return self.session

    def __exit__(self, type, value, traceback):
        self.session.commit()
        self.session.close()
        self.connection.close()


def insert_value(a, b, c):
    with DbSession() as db:
        db.add(Value(a = a, b = b, c = c))

【讨论】:

以上是关于如何使用 SQLAlchemy 插入数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 SQLAlchemy 和 Pandas 插入数据 - Python

无法从 sqlalchemy 插入到 mysql

SQLAlchemy 在 Oracle DB 中批量插入 blob 数据

Flask sqlalchemy 多对多插入数据

Python使用SQLAlchemy连接数据库并创建数据表插入数据删除数据更新表查询表(CRUD)

Sqlalchemy - 当数据存在关系时,如何正确地将数据批量插入数据库