2014-01-30 24 views
6

我是Flask和SQLAlchemy的新手(过去3年一直与Django一起工作)。我需要调用一个现有的 PostgreSQL函数来写入数据库中的3个不同的表。这是我无法控制的(我只需要让它工作)。该函数返回一个记录(自定义Postgres类型)和有关结果的信息。以下是代码:在烧瓶中提交来自PostgreSQL函数的事务

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方法中的代码。这似乎是调用“connect()”只是从池中获得一个新的连接(默认设置为size = 5 - 至少我没有设置为5)。所以,我不确定它是否有很大的伤害。不过,通过使原始问题中的示例发挥作用,似乎应该让代码变得更清洁。我仍然希望有人能告诉我该怎么做。

回答

1

如果你正在使用SQLAlchemy的原始SQL,那么我认为你必须自己发布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;') 
... 
+0

非常感谢您的回复。我已经提供了确切的代码,并没有提交交易。它也不会产生错误。 –

+0

嗯。那么add_purchase如何工作?你有代码吗?这可能会有帮助... – Moritz

+0

是的;请看原始问题。 “上面的代码运行没有错误,从日志消息中,我可以看到正确的数据从数据库返回。” –

相关问题