我想知道如何使用executesql
与不受web2py管理的表进行通信,并插入记录并从插入中获取生成的密钥。
如果那是不可能的,是否只需要请求DAL用于查询的光标,并允许我将光标问cursor.lastrowid
。
我很确定我可以将executesql
用于我的SELECT和UPDATE语句 - 而不是我需要获取PK的INSERT语句。
我对MySQL之外的可移植性不感兴趣,因为我将一些复杂的遗留代码移植到web2py应用程序中而没有完全重写。这个遗留代码需要跨多个Python Web框架工作。我可以轻松地抽象连接/光标,但不能更改每个新框架的整个数据模型。只要我创建自己的pymysql连接,工作就完成了 - 但我真的想分享Web2py已经拥有的连接。
答案 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)。
希望这有帮助。