我正在使用Tornado web server编写服务器应用程序。应用程序通过tornado.database
模块与MySQL数据库一起使用。在DB中有一个表
CREATE TABLE SampleTable (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
txt VARCHAR(256)
);
作为对某些查询的反应,我需要在此表中写入新记录,并将新创建的记录的id
返回给客户端。所以在服务器代码中我有这些行:
class Application(tornado.web.Application):
def __init__(self):
handlers = [(r'/somequery', queryHandler)]
tornado.web.Application.__init__(self, handlers)
self.db = tornado.database.Connection(
host="localhost", database="sampledb",
user="sampleuser", password="samplepassword")
和一个处理程序:
class queryHandler(tornado.web.RequestHandler):
def post(self):
lastid = self.db.execute_lastrowid("INSERT INTO \
SampleTable (txt) \
VALUES('some text');")
print lastid
据我所知,tornado.database
是MySQLdb
python模块的一个相对简单的包装器,它保证了每个连接的最后一行id的正确工作。在我的情况下,整个应用程序只有一个连接。
因此,如果对/somequery
进行多次并发客户端查询,最终行ID可能会在客户端之间混乱,还是龙卷风会处理它?</ p>
我尝试调查tornado.database
的{{3}},但对我的问题一无所知。
如果这不行,怎么办?
答案 0 :(得分:2)
execute_lastrowid
(实际上tornado.database
一般而言)不是异步的,也就是说,它会阻止你的应用程序。
因此,您不会从其他客户端的请求中获取id,但如果一次插入需要很长时间,则其他客户端将不得不等待它。
与您的问题无关,但通常无法通过GET请求访问数据更改(例如INSERT)。改为使用POST。