没有会话的 flask sqlalchemy 插入
flask sqlalchemy insert without session
嗨,有什么方法可以在不使用会话的情况下向数据库插入一行。一个简单的例子:
try:
db.session.add(user1)
#in here I want to insert a row to my db but I can't do it with session because if i commit in here it will commit all inserts so my transaction not work.
db.session.add(user2)
except:
db.session.rollback()
else:
db.session.commit()
谢谢
如果您想独立于默认 db.session
提交更改,有两种可能性。
如果您需要实际会话,请使用 SQLAlchemy 创建一个并将其用于您的日志条目:
from sqlalchemy import orm
...
@app.route('/')
def index():
model = MyModel(name='M1')
db.session.add(model)
with orm.Session(db.engine).begin() as log_session:
# Session.begin will commit automatically.
log = MyLog(message='hello')
log_session.add(log)
return ''
如果您只是在日志中插入条目 table 您可以使用引擎连接。
import sqlalchemy as sa
...
@app.route('/')
def index():
model = MyModel(name='M1')
db.session.add(model)
log_table = sa.Table('my_log', db.metadata, autoload_with=db.engine)
with db.engine.begin() as conn:
conn.execute(log_table.insert(), {'message': 'hello'})
db.session.rollback()
return ''
您还可以使用 (2.) 中的机制发送原始 SQL 语句,方法是将 log_table.insert
替换为 sa.text(sql_string)
无论您选择如何执行此操作,请注意:
- 由于事务隔离,你们两个事务可能对数据库中的数据有不同的看法
- 您有责任确保这些额外的 sessions/transactions/connections 在必要时回滚、提交和关闭
- 您负责处理问题场景,例如,如果错误导致
db.session
回滚,使日志消息可能无效。
嗨,有什么方法可以在不使用会话的情况下向数据库插入一行。一个简单的例子:
try:
db.session.add(user1)
#in here I want to insert a row to my db but I can't do it with session because if i commit in here it will commit all inserts so my transaction not work.
db.session.add(user2)
except:
db.session.rollback()
else:
db.session.commit()
谢谢
如果您想独立于默认 db.session
提交更改,有两种可能性。
如果您需要实际会话,请使用 SQLAlchemy 创建一个并将其用于您的日志条目:
from sqlalchemy import orm ... @app.route('/') def index(): model = MyModel(name='M1') db.session.add(model) with orm.Session(db.engine).begin() as log_session: # Session.begin will commit automatically. log = MyLog(message='hello') log_session.add(log) return ''
如果您只是在日志中插入条目 table 您可以使用引擎连接。
import sqlalchemy as sa ... @app.route('/') def index(): model = MyModel(name='M1') db.session.add(model) log_table = sa.Table('my_log', db.metadata, autoload_with=db.engine) with db.engine.begin() as conn: conn.execute(log_table.insert(), {'message': 'hello'}) db.session.rollback() return ''
您还可以使用 (2.) 中的机制发送原始 SQL 语句,方法是将
log_table.insert
替换为sa.text(sql_string)
无论您选择如何执行此操作,请注意:
- 由于事务隔离,你们两个事务可能对数据库中的数据有不同的看法
- 您有责任确保这些额外的 sessions/transactions/connections 在必要时回滚、提交和关闭
- 您负责处理问题场景,例如,如果错误导致
db.session
回滚,使日志消息可能无效。