Torndb(错误:无法连接到本地主机上的MySQL)

0 投票
1 回答
991 浏览
提问于 2025-04-17 17:47

我正在尝试使用tornado和torndb开发一个网页应用,但在与数据库交互时遇到了一些问题。我写了一个“数据库”类,目的是为了封装torndb,以便为我的网页应用提供一些常用的数据库功能。当我调用这个数据库类中的任何方法时,似乎连接数据库时出现了问题:

“错误:无法连接到本地的MySQL”

我的构造函数已经打开了连接,所以我有点困惑,为什么在连接已经打开后还会看到这个消息。我猜这可能是作用域或垃圾回收的问题,我还不太明白。我的目标是只创建一次数据库对象,这样在服务器运行期间就能保持这个连接。

以下代码片段确实按预期工作,这让我怀疑可能是作用域或垃圾回收的问题:

#!/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()):

错误:无法连接到本地的MySQL

还有一些其他信息:

问题:

  • 为什么在定义类的模块的部分创建数据库对象和在其他地方创建数据库对象会有区别?

1 个回答

1

这个问题是因为传给查询的字符串参数没有进行转义。只要做以下修改,就能正常工作:

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)

撰写回答