twisted mysql_在Twisted下用MySQLadbapi获取自增id
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相关推荐
- 【MyBatis使用】 mapper文件未编译 + statementType使用 + 返回结果字段顺序不一致 + 获取自增ID + 一个update标签批量更新记录
1. mapper 文件未编译 如果mapper文件未编译,会报绑定异常. <build><resources><resource><directory> ...
- oracle如何获取自增id,oracle实现自增id
--oracle实现自增id --创建一张T_StudentInfo表 create table T_StudentInfo ( "id" integer not null pri ...
- mysql获取自增_mysql 获取自增id的值的方法
原生jdbc方式: Statement.getGeneratedKeys() 示例: Statement stmt = null; ResultSet rs = null; try { // // C ...
- MyBatis-Plus 新增插入成功并获取自增Id(没问题 已实验哟)
MyBatis-Plus 新增插入成功并获取自增Id 我知道的有三种的方法可以插入新增同时获取到自增Id(插入成功的Id): mp自带 和 注释 和 xml的方法. 实体类:UserInfo /*** ...
- mybatis入门学习(九) -DB环境切换、使用注解、事务提交、获取自增ID、多参数传参、鉴别器、内置参数、批量写入、Oracle字段无法插入 null 值
一.多数据库环境切换 1.config配置: <!-- default="mydemo" 指定连接的数据库 --><environments default=&q ...
- 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 ...
- mysql什么方法返回id_MYSQL获取自增ID的四种方法
四种方法 1. select max(id) from tablename 2.SELECT LAST_INSERT_ID() LAST_INSERT_ID 是与table无关的,如果向表a插入数据后 ...
- MYSQL里的DBS是什么_DBS-MySQL:MYSQL获取自增ID的四种方法
1. select max(id) from tablename 2.SELECT LAST_INSERT_ID() 函数 LAST_INSERT_ID 是与table无关的,如果向表a插入数据后,再 ...
- mysql获取自增id
JAVA在插入自增主键的一条数据,如何同时获取该条自增的主键id? 业务场景 开发业务场景:在学生管理系统业务场景中,比如班上新来一名转校学生小吴,并参与了此次学校的摸底考试,那么系统管理员需要将他的 ...
最新文章
- 如何具体学习计算机视觉
- c语言实现补码加减,C语言实现用位移运算符进行加减乘…
- “笨方法”学习Python笔记(1)-Windows下的准备
- 常用的几种大数据架构剖析
- 把ASP应用中的Session传递给asp.net应用
- AUTOSAR从入门到精通100讲(八十五)-AUTOSAR基础篇之BswM
- MyBatis 特殊字符处理
- 【计蒜客 - 2019南昌邀请赛网络赛 - K】MORE XOR(数学,找规律,打表)
- php是阻塞模式吗,PHP非阻塞模式 - 黑白大熊猫的个人空间 - OSCHINA - 中文开源技术交流社区...
- 红帽子服务器怎么重装系统,红帽子RHCS套件安装与配置
- git bitbucket_如何在Bitbucket上创建新的Git存储库并查看提交的对象
- 报时功能_拥有自鸣等20种复杂功能的百达翡丽6300G 连日期都可以用打簧报时听出来...
- 后端如何收取多个文件_一次上传多个文件机制的两种解决方案
- ubuntu 10.10 安装google拼音输入法 并实现光标跟随
- 《财富》推荐的75部必看书籍
- java判断闰年中闰月_编程序:计算某年某月有多少天(区分闰年和闰月)?怎么编?...
- 提取小米手机系统完整包BOOT,及ROOT!
- 中国大学mooc c语言作业,中国大学mooc程序设计入门——C语言:第三周测验(示例代码)...
- 西电微机系统课程设计——步进电机开环控制系统设计
- win10没有wifi列表,显示不出可用WiFi
热门文章
- [新品发布]全球首个百万IOPS云盘来了 阿里云推出超高性能云盘ESSD
- 英特尔表示:元宇宙的路还很长
- 锐捷发布极简以太全光解决方案 打造“不一样”的全光网
- 人工智能进行时:人类的未来与未来的人类
- C++和Lua交互教程(基于LuaBridge)
- vue 前期准备,项目结构
- 如何监控Android电视桌面,androidTV 电视桌面的效果
- wow mysql dbc_DBC中悲观锁介绍附案例详解
- 生产环境遇到难题,你是如何解决的?
- SpringBoot 整合 Shiro thymeleaf _01_Shiro概念