SQLAlchemy插入查询不返回结果

时间:2019-03-25 17:33:07

标签: python postgresql sqlalchemy psycopg2

我试图从插入查询中选择返回值:

HOST_INSERT_QUERY = (
    Host.__table__.insert()
        .values(
            name=bindparam("name"),
            source=bindparam("source"),
            type=bindparam("type")
                )
        .returning(Host.__table__.c.id)
)
result = db_conn.execute(HOST_INSERT_QUERY, values)

我从db.echo中看到的内容:

info sqlalchemy.engine.base.Engine INSERT INTO hosts (name, source, type) VALUES ( %(name)s, %(source)s, %(type)s) RETURNING hosts.id
info sqlalchemy.engine.base.Engine ({ 'name': 'hhh', 'source': '["import"]', 'type': 'host'},{...})
debug:  Added 2 hosts

它确实有效。主机可以插入数据库,但是我在调​​试器中看到了一些麻烦;结果(ResultProxy)具有:

rowcount = 2 #right!
is_insert = True #right!
return_rows=False #WHYYYY????????

如果我尝试:

result.fetсhall()

AttributeError: 'ResultProxy' object has no attribute 'fetсhall'

版本:

  • SQLAlchemy 1.3.1
  • psycopg-binary 2.7.7

注意! 该代码仅在插入单个记录时有效。插入多行时,无法将值从RETURNING中拉出。

1 个答案:

答案 0 :(得分:0)

You cannot get results from executemany,如果您要传递一组多于一行的行,SQLAlchemy将在下面使用它。这就是为什么您观察<ion-header> <ion-navbar> <ion-title>Home</ion-title> </ion-navbar> </ion-header> <ion-content padding> <form (ngSubmit)='login()'> <ion-item> <ion-input type="text" name="username" [(ngModel)]="username"></ion-input> </ion-item> <ion-item> <ion-input type="password" name="password" [(ngModel)]="password"></ion-input> </ion-item> <ion-button type="submit">Submit</ion-button> </form> </ion-content>的原因。一种解决方法是使用一个多return_rows=False子句“内联”行,而不是使用bindparams和VALUES

executemany

这作为单个“多值”语句执行,因此避免使用HOST_INSERT_QUERY = ( Host.__table__.insert() .values(values) .returning(Host.__table__.c.id) ) result = db_conn.execute(HOST_INSERT_QUERY) ,并可能返回结果。请注意,返回的ID的顺序可能与插入的行的顺序不匹配。