新民正规网站建设价格咨询,如何在服务器上放网站,网站开发用户登陆的安全,玩转wordpressD jango的ORM有一个很便捷的功能#xff0c;其实也应该说是一个很基本的功能吧。就是在对一个model调用 save() 插入到数据库后#xff0c;会将创建的D jango的ORM有一个很便捷的功能#xff0c;其实也应该说是一个很基本的功能吧。就是在对一个model调用 save() 插入到数据…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(hostheaven, usergod,passwdjesus, dbelysium)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 MySQLdbreturn 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中文网