我试图从插入查询中选择返回值:
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'
版本:
注意! 该代码仅在插入单个记录时有效。插入多行时,无法将值从RETURNING中拉出。
答案 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的顺序可能与插入的行的顺序不匹配。