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)
希望这有帮助