我在使用 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(...))
uj5u.com熱心網友回復:
https://docs.sqlalchemy.org/en/14/orm/session_transaction.html
根據上述檔案,我猜autocommit已經被棄用了。他們session.begin()現在有一種自動提交的方法。
所以你可以這樣使用它:
with db_session.begin():
foo
uj5u.com熱心網友回復:
我解決了這個問題。
我認為問題的原因是:
- 自動提交的使用
- 我啟動了兩次引擎,一次用于會話,一次用于基類。
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))
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/347506.html
標籤:Python 数据库 sqlite sqlalchemy
下一篇:使UIImageView落下
