You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Twisted的runQuery插入MySQL后如何获取最后插入的行ID

解决方案

runQuery 方法的返回值是查询结果的列表,并非数据库游标对象,因此无法直接获取lastrowid属性,这是你之前尝试调用该属性不生效的核心原因。要拿到插入行的自增ID,需要使用runInteraction方法,它会在同一个事务会话中传递活动游标对象,你可以直接从游标中读取该属性。

优化后的实现代码如下:

@inlineCallbacks
def get_or_create_node_id(self, node_name):
    def _transaction_operation(cursor):
        # 先查询节点是否已存在
        cursor.execute("SELECT id FROM nodes WHERE name = %s", (node_name,))
        exist_record = cursor.fetchone()
        if exist_record:
            return exist_record[0]
        # 节点不存在则执行插入
        cursor.execute("INSERT INTO nodes (name) VALUES (%s)", (node_name,))
        # 直接从游标获取最后插入的自增ID
        return cursor.lastrowid

    try:
        node_id = yield self.db.runInteraction(_transaction_operation)
        returnValue(int(node_id))
    except ConnectionError:
        log.error("db interaction failed due to connection error")

该实现的优势:

  • 所有数据库操作在同一个事务内完成,避免并发场景下的重复插入问题,数据一致性更高
  • 减少了2次不必要的SQL查询,执行效率更高
  • 直接通过游标原生属性获取插入ID,不需要额外的查询逻辑
  • 修正了原代码中SQL参数的写法问题:单元素元组需要额外加逗号,(node_name,)才是合法的元组参数,(node_name)会被识别为字符串本身,可能引发参数绑定错误

内容的提问来源于stack exchange,提问作者user11183733

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 03:57:02