与python的MySql数据库连接

时间:2012-12-03 00:59:19

标签: mysql python-2.7 mysql-python

我在尝试使用python连接到数据库时遇到了问题。它编译没有错误,但它似乎没有做任何事情。我不确定我是否错误地实例化了这个类或者问题是什么。有人能指出我正确的方向吗?

import _mysql
import MySQLdb

class Operations:
    def open():
        db=_mysql.connect("127.0.0.1","root","admin","test")
        c=db.cursor()

    #deletes the cursor
    def close(self):
        c.close()

        #verifies the credentials and advances
    def login(self):
        print "Welcome to the online bookstore login!"
        x = raw_input('Please enter your user id. ')
        y = raw_input('Please enter your password. ')

        c.execute("""SELECT userid,password FROM members WHERE userid = %s""", (x,))
        z = c.password

        if y == z:
            member_menu()
        else:
            close()


    def new_user(self):
        print "Welcome to the Online book store new user registration page!"
        print "To begin, please enter your first name: "
        fName = raw_input('Please enter your first name: ')
        lName = raw_input('Please enter your last name: ')
        address = raw_input('Please enter your street address: ')
        city = raw_input('Please enter your city: ')
        state = raw_input('Please enter your state: ')
        zip_code = raw_input('Please enter your zip code: ')
        phone = raw_input('Please enter your phone number: ')
        email = raw_input('Please enter your email: ')
        user_ID = raw_input('Please enter your user id: ')
        password = raw_input('Please enter your password: ')

        c.executemany("""INSERT INTO members(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s,) VALUES (fName, lName, address, city, state, zip_code, phone, email, user_id, password,)""")

        print "Your account has been created. returning to the welcome menu. "
        welcome()

    def welcome(self):
        choice = NONE;

        print "**********************************************************************\n"
        print "***\t\t\t\t\t\t\t\t   ***\n"
        print "***\t\tWelcome to the Online Book Store\t\t   ***\n"
        print "***\t\t\t\t\t\t\t\t   ***\n"
        print "**********************************************************************\n"
        print "1. Member Login\n"
        print "2. New Member Registration\n"
        print "3. Quit\n"
        choice = raw_input('Type in your option: ')

        if choice == 1:
            login()
        elif x == 2:
            new_user()
        else:
            close()


    def member_menu(self):
        x = NONE
        print "**********************************************************************\n"
        print "***\t\t\t\t\t\t\t\t   ***\n"
        print "***\t\t   Welcome to the Online Book Store   \t\t   ***\n"
        print "***\t\t\t    Member Menu   \t\t\t   ***\n"
        print "***\t\t\t\t\t\t\t\t   ***\n"
        print "**********************************************************************\n"
        print "1. Search by Author/Title/Subject\n"
        print "2. View/Edit Shopping Cart\n"
        print "3. Check Order Status\n"
        print "4. One Click Check Out\n"
        print "5. Logout\n"
        print "Type in your option: "
        x = raw_input('Please enter your choice. ')

        if x == 1:
            close_conn(),
        elif  x == 2:
            close_conn(),
        elif  x ==  3:
            close_conn(),
        elif  x ==  4:
            close_conn(),
        else:
            close_conn()

    def main():
        start = Operations()
        print "Opening conenction to database"
        start.welcome

    if __name__ == '__main__':
        main()

1 个答案:

答案 0 :(得分:1)

嗯,您的代码存在很多问题,无论如何我都可能会错过其中的一些。

  1. 没有任何事情发生,因为你的main()函数和条件都是类定义的一部分,所以所有解释器看到的实际上都是两个导入和一个类定义。

  2. 假设我们取消了main()定义和条件的缩进。所有会发生的事情是创建一个Operations实例(没有特殊效果,因为你没有定义自定义构造函数)并打印“打开到数据库的连接”到屏幕,因为main()中的所有最后一行都是引用welcome()方法并忽略它。你需要调用它:start.welcome()

  3. 当你打电话时,会出现更多问题。 NameErrors可能会首先出现,因为您使用的是在给定范围内不存在的标识符。看起来你是Python的对象模型的新手,可能来自一种使用不同方法的语言,比如C ++。在Python中,所有非静态和非类实例方法都将对它们所操作的对象的引用作为第一个参数,传统上称为“self”。如果要访问对象的任何字段,则需要通过“self”执行此操作,否则解释器将无法看到它们。例如:你打开一个连接并将光标保持为c,稍后你会在其他方法中重复使用它:

    def open():
        # ...
        c=db.cursor()
    # ...
    def login(self):
        # ...
        c.execute("...")
    

    这有两个原因:

    • 你的open()方法不会将self作为参数
    • 你在open()方法的范围内创建c作为局部变量,然后尝试在login()中访问它,这实际上导致了“赋值前的引用”错误。

    为了正确,它应该写成这样:

    def open(self):
        # ...
        self.c = db.cursor()
    # ...
    def login(self):
        # ...
        self.c.execute("...")
    

    你在许多地方犯了同样的错误。你需要调用self.login(),self.new_user(),self.close()等。

  4. 你正在使用Python 2,至少根据问题的标签,在Python 2中声明类时需要记住一件事。存在所谓的旧式和新式类以及你是什么想要做的就是使用新式的。因此,您的类必须继承自object:

    class Operations(object):
        # ...
    

    他们最终决定放弃Python 3中的旧式类支持,并且不再需要显式继承对象,但是在Python 2中,你需要应对它。

  5. 虽然仍有一些错误或潜在的错误(什么是close_connection()?),我认为这对于一个好的开始是足够的;)。祝你好运。