【问题标题】:How to get a returned primary key after using executesql to insert a record使用executesql插入记录后如何获取返回的主键
【发布时间】:2017-11-24 11:56:14
【问题描述】:

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

如果这不可能,是否只需向 DAL 询问用于查询的游标并允许我向该游标询问 cursor.lastrowid

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

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

【问题讨论】:

    标签: web2py


    【解决方案1】:

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

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

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

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

      先决条件

      pip 安装 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()
      

      【讨论】:

        【解决方案3】:

        所以我四处挖掘,查看了 pydal 代码并想出了这个解决方案:

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

        它当然超越了官方的抽象,但即使我只需要 MySQL,我感觉它可以与许多适配器一起使用。 lastrowidtable 参数(即“用户”)在 MySQL DAL 实现中被忽略,但其他参数需要。我将它包含在我自己的代码中以保持完整性,但仅在 MySQL 上进行了测试。如何为参数设置占位符取决于您自己,因为它是特定于适配器的。

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

        【讨论】:

          猜你喜欢
          • 2012-09-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多