使用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
相关产品推荐
相关产品推荐

