gpt4 book ai didi

python - 从 Flask 中的 PostgreSQL 函数提交事务

转载 作者:太空狗 更新时间:2023-10-30 00:17:30 26 4
gpt4 key购买 nike

我是 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 的连接方法中的代码。似乎调用“connect()”只是从池中获取一个新连接(默认情况下似乎设置为 size=5——至少我没有将其设置为 5)。所以,我不确定它是否有很大的危害。但是,似乎应该通过使原始问题中的示例起作用来使此代码更清晰。我仍然希望有人能告诉我该怎么做。

最佳答案

如果您将原始 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;')
...

关于python - 从 Flask 中的 PostgreSQL 函数提交事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21469884/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com