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

Web2py 如何在使用executesql插入记录后获取返回的主键,web2py,Web2py,我想知道如何使用executesql与一个不由web2py管理的表进行通信,插入一条记录并从插入中获取生成的键 如果这是不可能的,那么只需要向DAL请求一个用于查询的游标,并允许我向该游标请求cursor.lastrowid 我非常确定我可以使用executesql来执行SELECT和UPDATE语句,而不是需要返回PK的INSERT语句 对于这段代码,我对MySQL之外的可移植性不感兴趣,因为我正在将一些复杂的遗留代码移植到web2py应用程序中,而不需要完全重写。此遗留代码需要跨多个Pyth

我想知道如何使用
executesql
与一个不由web2py管理的表进行通信,插入一条记录并从插入中获取生成的键

如果这是不可能的,那么只需要向DAL请求一个用于查询的游标,并允许我向该游标请求
cursor.lastrowid

我非常确定我可以使用
executesql
来执行SELECT和UPDATE语句,而不是需要返回PK的INSERT语句


对于这段代码,我对MySQL之外的可移植性不感兴趣,因为我正在将一些复杂的遗留代码移植到web2py应用程序中,而不需要完全重写。此遗留代码需要跨多个Python web框架工作。我可以很容易地抽象连接/游标,但不会为每个新框架更改整个数据模型。只要我建立自己的pymysql连接,所有的工作都完成了——但我真的很想分享Web2py已经拥有的连接。

因此我四处寻找,查看pydal代码,并提出了以下解决方案:

 sql = 'INSERT INTO Users ...'
 parms = {'name': 'chuck'}
 db._adapter.execute(sql, parms)
 new_key = db._adapter.lastrowid('Users')
当然,它已经超越了官方的抽象,但即使我只需要MySQL,我觉得这将适用于许多适配器。在MySQL DAL实现中,
lastrowid
(即“用户”)的
参数被忽略,但其他实现需要该参数。我在自己的代码中包含了完整性,但只在MySQL上进行了测试。如何为参数设置占位符取决于您,因为它是特定于适配器的


对我来说,这比建立和管理自己的数据库连接要好得多。

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

先决条件 pip安装pydal

更改为web2py目录,其中包含gloun文件夹

以下是粗略的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()

如果您使用的是传统数据库,请查看web2py手册。通过禁用迁移并提供兼容的表定义,您可以将pyDAL与先前存在的表链接,从而利用DAL功能

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

希望这有帮助