小编Mr.*_*ess的帖子

从烧瓶中的PostgreSQL函数提交事务

我是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)

python sqlalchemy flask flask-sqlalchemy

6
推荐指数
1
解决办法
1412
查看次数

TSQL - 自己更新表

(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使用非NULLs 的相应值更新s Item.因此,所有项目100都将读取10.00并且项目200都将读取25.00.

我觉得这应该是超级简单的,但无法弄清楚自我参考.

谢谢

t-sql sql-server

5
推荐指数
1
解决办法
1万
查看次数

在"declarative_base()"中获取最后插入的记录的主键

我想获得最后插入的主键,我已经知道两种方式:

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)

python sqlalchemy

2
推荐指数
1
解决办法
5734
查看次数

标签 统计

python ×2

sqlalchemy ×2

flask ×1

flask-sqlalchemy ×1

sql-server ×1

t-sql ×1