当前位置: 首页 > 知识库问答 >
问题:

从flask中的PostgreSQL函数提交事务

鲁成天
2023-03-14

我是Flask和SQLAlchemy的新手(在过去3年中一直与Django合作)。我需要调用一个现有的PostgreSQL函数,该函数可以写入数据库中的3个不同表。这是我无法控制的(我必须让它工作)。该函数返回一条记录(自定义Postgres类型),其中包含有关结果的信息。代码如下:

from flask.ext.sqlalchemy import SQLAlchemy

db = SQLAlchemy()

...

retval = db.engine.execute(
    'SELECT * FROM add_purchase(%s, %s, %s, %s, %s, %s, %s);',
    clean_data.account_id, amount, tax, deposit, clean_data.pos_id, 
    g.token_id, clean_data.external_reference_id).first()

app.logger.info(retval) # for debugging

db.session.commit()

上面的代码运行时没有错误。从日志消息中,我可以看到正确的数据是从数据库返回的。但是,如果我转到psql,就看不到新插入的数据。事务似乎从未实际提交过。

我能找到的大多数文档和示例都基于使用SQLAlchemy的ORM。我做错了什么?

堆栈信息:

Flask==0.10.1
Flask-SQLAlchemy==1.0
psycopg2==2.5.2
Python 2.7.3
Postgresql 9.3

最新消息

我已经找到了一种方法让它发挥作用,下面是一个对我来说确实有效的示例:

from sqlalchemy import exc

...

connection = db.engine.connect()
trans = connection.begin()
try:
    retval = connection.execute(
        'SELECT * FROM add_purchase(%s, %s, %s, %s, %s, %s, %s);',
        clean_data.account_id, amount, tax, deposit,
        clean_data.pos_id, g.token_id,
        clean_data.external_reference_id).first()
except exc.SQLAlchemyError:
    trans.rollback()
    raise
else:
    trans.commit()

我已经回顾了SQLAlChemy连接方法中的代码。似乎调用“连接()”只是从池中获得一个新的连接(默认情况下似乎设置为size=5——至少我没有设置为5)。所以,我不确定它是否有很大的危害。然而,通过使原始问题中的示例工作,似乎应该有办法使代码更干净。我仍然希望有人能告诉我怎么做。

共有1个答案

洪雅健
2023-03-14

如果您将原始SQL与SQLAlchemy一起使用,那么我认为您必须自己发出BEGIN和COMMIT语句。尝试添加如下内容:

...
begin_retval = db.engine.execute('BEGIN;')
retval = db.engine.execute('SELECT * FROM add_purchase(%s, %s, %s, %s, %s, %s, %s);',
clean_data.account_id, amount, tax, deposit, clean_data.pos_id, 
g.token_id, clean_data.external_reference_id).first()
commit_retval = db.engine.execute('COMMIT;')
...
 类似资料:
  • 本文向大家介绍基于Postgresql 事务的提交与回滚解析,包括了基于Postgresql 事务的提交与回滚解析的使用技巧和注意事项,需要的朋友参考一下 用过oracle或mysql的人都知道在sqlplus或mysql中,做一个dml语句,如果发现做错了,还可以rollback;掉,但在PostgreSQL的psql中,如果执行一个dml,没有先运行begin;的话,一执行完就马上提交了,不能

  • 问题内容: 如何设置初始化我的Flask应用程序以将Flask-SQLAlchemy设置为自动提交模式,除非我明确地不使用事务? 会话“ 开始通信后即开始数据库事务 ”。这是否会影响Postgres的难度比MySQL? 通过Instagram, 自动提交模式;在这种模式下,Psycopg2不会对任何查询发出BEGIN / COMMIT;相反,每个查询都在其自己的单语句事务中运行。这对于不需要事务语

  • 问题内容: 谁能告诉我这段代码出了什么问题?我尝试使用JavaScript提交表单,但显示错误“ .submit不是函数”。请参阅以下代码的更多详细信息: 我也尝试过这个: 两者都显示相同的错误:( 问题答案: 提交不是功能 表示您已将自己的提交按钮或其他元素命名为。将按钮重命名为,您的呼叫将神奇地工作。 将按钮命名为Submit时,将覆盖表单上的功能。

  • 问题内容: 在Flask 0.8中,我知道我可以使用来访问单个表单域form.fieldname.data,但是有一种简单的方法可以遍历所有表单域吗?我正在构建一个电子邮件正文,我想遍历所有字段并为每个字段创建一个字段名/值条目,而不是通过命名每个字段并附加来手动创建它。 问题答案: 你可以遍历表单数据: 你可以遍历所有表单字段:

  • 我在我的项目中做过类似的事情。我手动回滚事务,为此我插入了try-catch块并手动回滚catch块中的事务。现在我从method1调用method2,并将对象保存到method2()中的数据库中,但它不会将对象保存到数据库中。 我只是想知道什么是可能的解决方案,保存对象在方法2()在方法1()的faliure。 提前感谢。

  • 我试图在单击表单提交按钮时使用Jquery启动一个函数,但该函数需要在表单实际提交之前启动。 我试图在提交时将一些标记属性复制到隐藏的文本字段中,然后提交表单。 我已经通过使用功能(当提交按钮悬停在上方时)成功实现了这一点,但这在使用触摸的移动设备上不起作用。 我玩过提交函数,但是当表单提交时,而不是之前,函数会触发,所以值不会保存在字段中。 非常感谢。