flask sqlalchemy insert without session



我是否可以在不使用会话的情况下插入行到db。一个简单的例子:

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提交更改,有几种可能性。

  1. 如果您需要一个实际的会话,使用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 ''
    
  2. 如果你只是在日志表中插入条目,你可以直接使用引擎连接。

    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 ''
    
  3. 您也可以使用(2.)中的机制发送原始SQL语句,通过将log_table.insert替换为sa.text(sql_string)

无论你选择怎样做,都要注意:

  • 由于事务隔离,您的两个事务可能对数据库中的数据有不同的视图
  • 你有责任确保这些额外的会话/事务/连接在必要时被回滚、提交和关闭
  • 您负责处理问题场景,例如,如果错误导致db.session回滚,使日志消息可能无效。

最新更新