如何在使用executionql插入记录后获取返回的主键

时间:2017-06-21 14:07:46

标签: web2py

我想知道如何使用executesql与不受web2py管理的表进行通信,并插入记录并从插入中获取生成的密钥。

如果那是不可能的,是否只需要请求DAL用于查询的光标,并允许我将光标问cursor.lastrowid

我很确定我可以将executesql用于我的SELECT和UPDATE语句 - 而不是我需要获取PK的INSERT语句。

我对MySQL之外的可移植性不感兴趣,因为我将一些复杂的遗留代码移植到web2py应用程序中而没有完全重写。这个遗留代码需要跨多个Python Web框架工作。我可以轻松地抽象连接/光标,但不能更改每个新框架的整个数据模型。只要我创建自己的pymysql连接,工作就完成了 - 但我真的想分享Web2py已经拥有的连接。

3 个答案:

答案 0 :(得分:0)

所以我挖了一下,查看了pydal代码并提出了这个解决方案:

 sql = 'INSERT INTO Users ...'
 parms = {'name': 'chuck'}
 db._adapter.execute(sql, parms)
 new_key = db._adapter.lastrowid('Users')

它当然缩放到官方抽象之后,但即使我只需要MySQL,我也觉得这适用于许多适配器。 {D}实现中table lastrowid的{​​{1}}参数(即'用户')将被忽略,但其他人则需要。我在我自己的代码中包含它是为了完整性,但仅在MySQL上进行了测试。如何为参数设置占位符取决于您,因为它是适配器特定的。

对我来说,最好是建立和管理我自己的数据库连接。

答案 1 :(得分:0)

要在web2py之外查询和更新web2py数据库,我执行以下操作:

先决条件

pip install pydal

切换到你有gloun文件夹的web2py目录。

这是粗略的python伪代码:

from pydal import DAL, Field
from gluon.validators import *
from gluon.tools import Auth, Crud, Service, PluginManager

db_name = "path/to/your/db.sqlite"
db = DAL('sqlite://' + db_name)

# for some reason, you need to define the table
try:
    db.define_table('your_table',
    ...
    )
except Exception as ex:
    pass

rows_to_process = db(db.your_table.your_query).select()
for row in rows_to_process:
    # modify the row as per your requirement
    db(row).update(your_row_changes)
    db.commit()

答案 2 :(得分:0)

如果您正在使用旧数据库,请查看web2py图书上的Legacy databases and keyed tables。通过禁用迁移并提供兼容的表定义,您可以将pyDAL链接到预先存在的表,从而利用DAL功能。

实际上,如果你只是打电话给executesql(),用pyDAL包装你的数据库是没有意义的,因为根本没有抽象。您正在删除使该程序包成为数据库抽象层的所有功能。相反,只需直接使用您选择的数据库驱动程序(可能是pymysql或MySQLdb)。

希望这有帮助。