我正在尝试使用 tornado/torndb 开发一个 Web 应用程序,并且在我的数据库交互方面遇到了一些问题。我编写了一个包装 torndb 的“数据库”类,以便为我的 Web 应用程序提供一些常见的数据库功能。从我编写的 Database 类中调用任何方法时,与数据库的连接似乎存在问题:
“错误:根:连接到本地主机上的 MySQL 时出错”
我的构造函数打开了连接,所以我对为什么在打开连接后看到这条消息有点困惑。我希望这是我不理解的范围界定和/或 GC 问题。目标是创建一次数据库对象,从而使该单个连接在服务器的整个生命周期中持续存在,数据库被存储
以下代码片段确实按预期工作,这可能导致我出现范围界定或 GC 问题:
#!/usr/bin/python
import torndb
class Database:
def __init__(self):
try:
self.__dbh = torndb.Connection(
'localhost',
'mydb',
user = 'myuser',
password = 'mypass')
except Exception as e:
print e
def user_add(self, user, email, passwd):
insert = "INSERT INTO users (username, email, passwd) VALUES " + \
"(%s, %s, %s)" % (user, email, passwd)
rowid = 0
try:
rowid = self.__dbh.execute(insert)
except Exception as e:
print e
if rowid is 0:
return (False, 'User exists');
return (True, None)
if __name__ == "__main__":
print 'Testing'
raw_input('Hit enter to connect to the DB')
d = Database();
users = []
raw_input('Hit enter to create some users')
for i in range(5):
users.append(str(i))
d.user_add(users[i], users[i], users[i])
<- 剪辑->
问题是当我尝试从定义数据库类的模块的主模块以外的任何地方创建数据库对象时,例如:
import tornado.ioloop
import tornado.httpserver
import tornado.web
from register import Register
from logon import Logon
from db import Database
class Application(tornado.web.Application):
def __init__(self):
resources = [
(r"/logon", Logon),
(r"/register", Register)
]
self.db = Database()
tornado.web.Application.__init__(self, resources)
try:
self.db.user_add('testuser', 'testemail', 'password')
except Exception as e:
print e
if __name__ == "__main__":
app = Application()
# Start the server.
server = tornado.httpserver.HTTPServer(app)
server.listen(8080)
tornado.ioloop.IOLoop.instance().start()
执行时打印上述内容(由于调用 self.__dbh.execute()):
错误:root:连接到本地主机上的 MySQL 时出错
其他一些信息:
- 我可以从控制台连接到数据库而没有任何问题。
- 我正在关注这个例子https://github.com/facebook/tornado/blob/master/demos/blog/blog.py#L60
- torndb 版本是 2.4.1,torndb 版本是最新的(使用 pip 拉取)。
问题:
- 为什么我在定义类的模块的主模块中创建我的数据库对象与在其他任何地方创建数据库对象有区别?