D jango的ORM有一个很便捷的功能,其实也应该说是一个很基本的功能吧。就是在对一个model调用 save() 插入到数据库后,会将创建的

D jango的ORM有一个很便捷的功能,其实也应该说是一个很基本的功能吧。就是在对一个model调用 save() 插入到数据库后,会将创建的自增id同步到当前model上。SQL中调用 INSERT 默认的返回值是插入的行数,就目前的应用来说,其实是一个没啥意义的返回值,所以Django的ORM能够处理好自增id的同步是一件很让人愉悦的事。

不过没有使用Django,最近用的是Twisted提供的adbapi,如何获取自增id呢?

如果是我力挺的PostgreSQL的话,很简单,,给 INSERT 加上 RETURNING 语句就可以了:

INSERT INTO distributors (did, dname)

VALUES (DEFAULT, 'XYZ Widgets') RETURNING did;

不过MySQL呢?

最近用了一阵子MySQL,只是从命令行自动补全这方面来说,就已经明显地感觉到和PostgreSQL的差距了。老实说真不知道为啥那么多人如此热爱深爱着MySQL……

在StackOverflow上搜了一下,找到两种方法,要么是使用

SELECT LAST_INSERT_ID();

或者是使用connector的 mysql_insert_id() 函数,这个对于Python中的 MySQLdb 来说就是connection的 insert_id() 函数,比如:

conn = MySQLdb.connect(host='heaven', user='god',

passwd='jesus', db='elysium')

cursor = conn.cursor()

cursor.execute('INSERT INTO account VALUES (%s, %s)',

('satan', 'male or female, who knows'))

new_id = conn.insert_id() # <= 就是这玩意儿

过程也还算简单,但是对于Twisted的adbapi来说,我们的活并没有结束。为啥呢?因为adbapi用的是线程池来管理MySQL的连接的,每次Query调用,都会从线程池中获取一个线程,然后将相应的事务defer到该线程来处理。其默认的事务是以单个SQL语句为划分的,所以说,对于MySQL这样在执行完后还需要做其他操作的需求来说,默认的接口是无法满足的。这儿我再吐一下槽,还是pg好啊……

默认接口不够用,那我们就只能扩展它了。稍稍看一下adbapi的源代码我们可以发现,对于通常事务,adbapi其实是使用了 runInteraction 这个接口函数的。具体不同的事务,adbapi是将相应的callback作为其第一个参数,然后在 deferToThreadPool 时指定线程运行该callback来实现。所以,我们只需要为MySQL定义一种新的事务就可以了。

下面就是我们需要定义的新事务:

def runMySQLInsert(self, *args, **kw):

assert self.dbapiName == 'MySQLdb'

return self.runInteraction(self._runMySQLInsert, *args, **kw)

def _runMySQLInsert(self, trans, *args, **kw):

trans.execute(*args, **kw)

return trans.connection.insert_id()

Ok,接下来,把这两个函数Monkey Patch到adbapi上就完事了:)

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:php中文网

twisted mysql_在Twisted下用MySQLadbapi获取自增id相关推荐

  1. 【MyBatis使用】 mapper文件未编译 + statementType使用 + 返回结果字段顺序不一致 + 获取自增ID + 一个update标签批量更新记录

    1. mapper 文件未编译 如果mapper文件未编译,会报绑定异常. <build><resources><resource><directory> ...

  2. oracle如何获取自增id,oracle实现自增id

    --oracle实现自增id --创建一张T_StudentInfo表 create table T_StudentInfo ( "id" integer not null pri ...

  3. mysql获取自增_mysql 获取自增id的值的方法

    原生jdbc方式: Statement.getGeneratedKeys() 示例: Statement stmt = null; ResultSet rs = null; try { // // C ...

  4. MyBatis-Plus 新增插入成功并获取自增Id(没问题 已实验哟)

    MyBatis-Plus 新增插入成功并获取自增Id 我知道的有三种的方法可以插入新增同时获取到自增Id(插入成功的Id): mp自带 和 注释 和 xml的方法. 实体类:UserInfo /*** ...

  5. mybatis入门学习(九) -DB环境切换、使用注解、事务提交、获取自增ID、多参数传参、鉴别器、内置参数、批量写入、Oracle字段无法插入 null 值

    一.多数据库环境切换 1.config配置: <!-- default="mydemo" 指定连接的数据库 --><environments default=&q ...

  6. Mybatis selectKey获取自增ID(DB2/Sybase/MySQL/Oracle/达梦)

    Mybatis selectKey获取自增ID(DB2/Sybase/MySQL/Oracle/达梦) 1.selectKey 2.不同数据库写法 2.1 DB2 2.2.Sybase 2.3 MyS ...

  7. mysql什么方法返回id_MYSQL获取自增ID的四种方法

    四种方法 1. select max(id) from tablename 2.SELECT LAST_INSERT_ID() LAST_INSERT_ID 是与table无关的,如果向表a插入数据后 ...

  8. MYSQL里的DBS是什么_DBS-MySQL:MYSQL获取自增ID的四种方法

    1. select max(id) from tablename 2.SELECT LAST_INSERT_ID() 函数 LAST_INSERT_ID 是与table无关的,如果向表a插入数据后,再 ...

  9. mysql获取自增id

    JAVA在插入自增主键的一条数据,如何同时获取该条自增的主键id? 业务场景 开发业务场景:在学生管理系统业务场景中,比如班上新来一名转校学生小吴,并参与了此次学校的摸底考试,那么系统管理员需要将他的 ...

最新文章

  1. 如何具体学习计算机视觉
  2. c语言实现补码加减,C语言实现用位移运算符进行加减乘…
  3. “笨方法”学习Python笔记(1)-Windows下的准备
  4. 常用的几种大数据架构剖析
  5. 把ASP应用中的Session传递给asp.net应用
  6. AUTOSAR从入门到精通100讲(八十五)-AUTOSAR基础篇之BswM
  7. MyBatis 特殊字符处理
  8. 【计蒜客 - 2019南昌邀请赛网络赛 - K】MORE XOR(数学,找规律,打表)
  9. php是阻塞模式吗,PHP非阻塞模式 - 黑白大熊猫的个人空间 - OSCHINA - 中文开源技术交流社区...
  10. 红帽子服务器怎么重装系统,红帽子RHCS套件安装与配置
  11. git bitbucket_如何在Bitbucket上创建新的Git存储库并查看提交的对象
  12. 报时功能_拥有自鸣等20种复杂功能的百达翡丽6300G 连日期都可以用打簧报时听出来...
  13. 后端如何收取多个文件_一次上传多个文件机制的两种解决方案
  14. ubuntu 10.10 安装google拼音输入法 并实现光标跟随
  15. 《财富》推荐的75部必看书籍
  16. java判断闰年中闰月_编程序:计算某年某月有多少天(区分闰年和闰月)?怎么编?...
  17. 提取小米手机系统完整包BOOT,及ROOT!
  18. 中国大学mooc c语言作业,中国大学mooc程序设计入门——C语言:第三周测验(示例代码)...
  19. 西电微机系统课程设计——步进电机开环控制系统设计
  20. win10没有wifi列表,显示不出可用WiFi

热门文章

  1. [新品发布]全球首个百万IOPS云盘来了 阿里云推出超高性能云盘ESSD
  2. 英特尔表示:元宇宙的路还很长
  3. 锐捷发布极简以太全光解决方案 打造“不一样”的全光网
  4. 人工智能进行时:人类的未来与未来的人类
  5. C++和Lua交互教程(基于LuaBridge)
  6. vue 前期准备,项目结构
  7. 如何监控Android电视桌面,androidTV 电视桌面的效果
  8. wow mysql dbc_DBC中悲观锁介绍附案例详解
  9. 生产环境遇到难题,你是如何解决的?
  10. SpringBoot 整合 Shiro thymeleaf _01_Shiro概念