如何使用 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 在 Oracle DB 中批量插入 blob 数据