pdm83
pdm83

Reputation: 11

Torndb (ERROR:root:Error connecting to MySQL on localhost)

I'm attempting to develop a web app using tornado/torndb and am running into some issues with my database interactions. I've written a "Database" class which wraps torndb in order to provide some common database functionality for my web app. When invoking any of the methods from the Database class I've written there seems to be a problem with the connection to the database:

"ERROR:root:Error connecting to MySQL on localhost"

My constructor opens the connection so I'm a bit confused as to why I see this message after the connection has been opened. I expect this is a scoping and/or GC issue that I am not understanding. The goal is to to create the Database object once and thus just have that single connection persist throughout the life of the server, the db is stored

The following code snippet does work as expected which led me to the scoping or GC issue possibly:

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

<- snip ->

The issue is when I try to create a Database object from anywhere other than the main of the module that defines the Database class, for example:

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()

The above when executed prints (due to the call to self.__dbh.execute()):

ERROR:root:Error connecting to MySQL on localhost

Some other bits of information:

Questions:

Upvotes: 0

Views: 997

Answers (1)

pdm83
pdm83

Reputation: 11

The problem was due to the string arguments passed to the query not being escaped, with the following change it works:

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)

Upvotes: 1

Related Questions