我是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()
Run Code Online (Sandbox Code Playgroud)
上面的代码运行没有错误.从日志消息中,我可以看到从数据库返回正确的数据.但是,如果我去psql,我看不到新插入的数据.似乎事务从未真正提交过.
我能找到的大多数文档和示例都基于使用SQLAlchemy的ORM.我在这做错了什么?
堆栈信息:
Flask==0.10.1
Flask-SQLAlchemy==1.0
psycopg2==2.5.2
Python 2.7.3
Postgresql 9.3
Run Code Online (Sandbox Code Playgroud)
更新
我找到了一种方法使它工作,这是一个实际上适合我的样本:
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() …
Run Code Online (Sandbox Code Playgroud) 表项(4列,为简化起见,简化)
Record | Item | Price | Zone
数据
1 | 100 | 10.00 | A 2 | 100 | NULL | B 3 | 100 | NULL | C 4 | 200 | 25.00 | A 5 | 200 | NULL | B
尝试NULL
使用非NULL
s 的相应值更新s Item
.因此,所有项目100都将读取10.00并且项目200都将读取25.00.
我觉得这应该是超级简单的,但无法弄清楚自我参考.
谢谢
我想获得最后插入的主键,我已经知道两种方式:
1)"lastrowid"与"原始SQL"
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, text
engine = create_engine('sqlite://')
meta = MetaData()
tbl = Table('tbl', meta,
Column('f1', Integer, primary_key=True),
Column('f2', String(64))
)
tbl.create(engine)
sql = text("INSERT INTO tbl VALUES (NULL, 'some_data')")
res = engine.execute(sql)
print(res.lastrowid)
Run Code Online (Sandbox Code Playgroud)
2)"inserted_primary_key",带有"insert()"
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String
engine = create_engine('sqlite://')
meta = MetaData()
tbl = Table('tbl', meta,
Column('f1', Integer, primary_key=True),
Column('f2', String(64))
)
tbl.create(engine)
ins = tbl.insert().values(f2='some_data')
res = engine.execute(ins)
print(res.inserted_primary_key)
Run Code Online (Sandbox Code Playgroud)
但我的问题是"declarative_base()"
from …
Run Code Online (Sandbox Code Playgroud)