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上就完事了:)

logo.gif

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

本文系统来源:php中文网

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/528256.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java客户端_Java常用的Http client客户端

Http Client应用场景&#xff1a;Http协议是最重要的网络协议之一&#xff0c;目前移动端的开发、javaweb前后端分离架构&#xff0c;使越来越多的java应用使用http协议访问资源。Http client 大多数场景使用在多个服务之间相互调用rest api&#xff0c;特别是现在微服务架构的…

java 新浪邮箱_使用javamail发送邮件,sina的邮箱作为发信人不行

我参照网上&#xff0c;写了一个简单的使用javamail发送邮件的程序&#xff0c;使用一般的邮件服务器作为发件人&#xff0c;程序都很正常&#xff1b;但使用smtp.sina.com.cn作为邮件服务器地址的发件人时&#xff0c;程序却验证失败&#xff01;这是什么原因&#xff1f;程序…

java des3加密_JAVA加密算法(3)- 对称加密算法(DES、3DES、AES)

对称加密算法概念加密密钥和解密密钥相同&#xff0c;大部分算法加密揭秘过程互逆。特点&#xff1a;算法公开、(相比非对称加密)计算量小、加密速度快、效率高。弱点&#xff1a;双方都使用同样的密钥&#xff0c;安全性得不到保证。常用对称加密算法DES(Data Encryption Stan…

android jni 调用java对象_Android NDK开发之Jni调用Java对象

本地代码中使用Java对象通过使用合适的JNI函数&#xff0c;你可以创建Java对象&#xff0c;get、set 静态(static)和 实例(instance)的域&#xff0c;调用静态(static)和实例(instance)函数。JNI通过ID识别域和方法&#xff0c;一个域或方法的ID是任何处理域和方法的函数的必须…

docker 容器端口访问不到_docker容器无法访问宿主机端口的解决

最近在工作时遇到一个问题,docker容器无法访问宿主机的redis,telent6379端口不通。 经排查发现,该服务器启用了防火墙,防火墙把6379的端口的访问授权给docker0网卡访问即可。 操作如下: firewall-cmd --permanent --zone=trusted --change-interface=docker0 firewall-cmd…

java public权限_Java public 访问权限

Java public 访问权限接下来&#xff0c;我们准备为大家介绍“public 访问权限”。在前面的学习中&#xff0c;我们已经接触过public这个关键字&#xff0c;就是在入口方法 main的前面&#xff0c;现在我们可以来回顾一下对应的代码&#xff1a;public class MyTest{publicstat…

java timer线程结束_Java线程Timer定时器用法详细总结

定时/计划功能主要使用的就是Timer对象&#xff0c;它在内部还是使用多线程的方式进行处理&#xff0c;所以它和线程技术还是有非常大的关联。Timer类主要作用就是设置计划任务&#xff0c;但封装任务的类却是TimerTask类。TimerTask类是一个抽象类。执行任务的时间晚于当前时间…

java在创建对象时必须_Java中5种创建对象的方式

以下是一些在Java中创建对象的方法&#xff1a;1、 使用new关键字使用new关键字是创建对象的最基本方法。这是在java中创建对象的最常见方法。几乎99%的对象都是这样创建的。通过使用这个方法&#xff0c;我们可以调用我们想要调用的任何构造函数(无参数或参数化构造函数)。//J…

java类的定义的实例_Java中类的定义和初始化示例详解

类的定义类的定义格式//创建类class classname{field &#xff1b;//成员属性/字段method&#xff1b;//方法}class为定义类的关键字&#xff0c;classname为类的名字&#xff0c;{ }为类的主体&#xff1b;例如&#xff1a;class person{public string name ; //成员属性publi…

java 多线程池_Java ThreadPoolExecutor线程池 同时执行50个线程

最近项目上有个需求&#xff0c;需要从FTP服务器中下载大批量的数据文件&#xff0c;然后解析该数据文件进行入库&#xff0c;数据库为oracle&#xff0c;最后在通过web工程&#xff0c;以报表和图表的形式进行展现。这些批量的数据文件为纯文本文件&#xff0c;每天产生数据文…

java and dsl_Groovy语法糖以及DSL

前言Why初次接触到Groovy是在实习中接触到一个 纯Groovy写的项目&#xff0c;当时看了下这不就是没有分号的Java么&#xff0c;而且也是有年纪的语言了&#xff0c;并不想投入时间学习。后来工作中越来越多的看到Groovy的身影&#xff0c;Gradle&#xff0c;Spring Cloud Contr…

java序列化的方法_【Java常见序列化与反序列方法总结】

人和电脑在很多方面都是十分相似的&#xff0c;大脑可以看成电脑主机&#xff0c;五官/身体等表面器官就是显示器、鼠标等外设。这篇文章就是想把计算机跟人做类比YY一下序列化和反序列化的机制、用途。如果你是初学者&#xff0c;心里肯定会问究竟什么是序列化/反序列化&#…

python的编码模块char_关于sqlmap当中tamper脚本编码绕过原理的一些总结(学习python没多久有些地方肯定理解有些小问题)...

sqlmap中tamper脚本分析编写置十对一些编码实现的脚本&#xff0c;很多sqlmap里面需要引用的无法实现&#xff0c;所以有一部分例如keywords就只写写了几个引用了一下&#xff0c;其实这里很多脚本运用是可以绕过安全狗的。本人也是刚开始学习python没多久&#xff0c;有一些错…

java的多态怎么理解_JAVA多态的理解

面向对象的三大特性&#xff1a;封装、继承、多态&#xff0c;其中最难理解的就是多态以下是网上某大神给的一个例子&#xff1a;1.继承关系class A {public String show(D obj){return ("A and D");}public String show(A obj){return ("A and A");}}clas…

java class isassignablefrom_Java之——Class的isAssignableFrom方法

转载请注明出处 https://blog.csdn.net/l1028386804/article/details/80508540Class的isAssignableFrom方法定义如下public native boolean isAssignableFrom(Class ? cls);由方法签名可见是一个本地方法 即C代码编写的。以下是JDK中的注释Determines if the class or interfa…

java中堆栈的基本操作_玩儿转队列和栈的基本操作及其应用:Java 版

队列的基本操作队列入队出队实现队列是种先进先出的数据结构。队列的基本操作主要是入队和出队。数据从队尾进入队列&#xff0c;从队首出队列。下面来写一个简单的队列:public class MyQueue {private List data;private int pointer;public MyQueue() {data new ArrayList&l…

java规定日期格式输出_Java格式化输出日期百分比时间等

Java格式化输出Java的格式化输出等同于String.Format&#xff0c;与C有很大的相似&#xff0c;比如System.out.printf(“%8.2f”, x);在printf中&#xff0c;可以使用多个参数&#xff0c;例如&#xff1a;System.out.printf(“Hello, %s. Next year, you’ll be %d”, name, a…

java界面编辑教程_java程序设计基础教程第六章图形用户界面编辑.docx

java程序设计基础教程第六章图形用户界面编辑.docx还剩27页未读&#xff0c;继续阅读下载文档到电脑&#xff0c;马上远离加班熬夜&#xff01;亲&#xff0c;很抱歉&#xff0c;此页已超出免费预览范围啦&#xff01;如果喜欢就下载吧&#xff0c;价低环保&#xff01;内容要点…

c盘java文件误删_java获取C盘下的隐藏目录文件名称

题记—— 执剑天涯&#xff0c;从你的点滴积累开始&#xff0c;所及之处&#xff0c;必精益求精&#xff0c;即是折腾每一天。网易云课堂在Java中&#xff0c; File类用来将文件或者文件夹封装成对象&#xff0c;方便对文件与文件夹的属性信息进行操作。File对象可以作为参数传…

对java这门课程的认识_关于java课程的总结

前言本次博客主要内容为此次三次作业的总结&#xff0c;整门java课程学习的总结&#xff0c;以及在此次java课程中的收获&#xff0c;和对课程的意见。作业过程总结第一次作业主要考察的是对程序的可扩展性&#xff0c;实现开闭原则非常重要&#xff0c;因为程序随着时间&#…