0

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

1 に答える 1

1

さて、あなたのコードには非常に多くの問題があるので、とにかくそれらのいくつかを見逃すでしょう。

  1. main()関数と条件は両方ともクラス定義の一部であるため、何も起こりません。したがって、インタープリターが認識するのは、実際には2つのインポートと1つのクラス定義だけです。

  2. main()の定義と条件のインデントを解除したとしましょう。次に発生するのは、Operationsのインスタンスを作成し(カスタムコンストラクターが定義されていないため、特別な効果はありません)、「データベースへの接続を開く」を画面に出力することです。 welcome()メソッドへの参照とそれを無視します。あなたはそれを呼び出す必要があります:start.welcome()

  3. あなたがそれを呼ぶとき、はるかに多くの問題が現れるでしょう。特定のスコープに存在しない識別子を使用しているため、NameErrorsが最初に発生する可能性があります。あなたはPythonのオブジェクトモデルに不慣れで、おそらくC++のような別のアプローチの言語から来ているようです。Pythonでは、すべての非静的および非クラスインスタンスメソッドは、操作しているオブジェクトへの参照を最初のパラメーターとして受け取ります。これは、従来は「self」と呼ばれていました。オブジェクトのフィールドのいずれかにアクセスする場合は、「self」を介してこれを行う必要があります。それ以外の場合、インタプリタには表示されません。例:接続を開き、カーソルをcのままにします。これは、後で他の方法で再利用します。

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

    これは2つの理由で正しくありません。

    • open()メソッドは自分自身をパラメーターとして取りません
    • 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でクラスを宣言するときに覚えておく必要があることが1つあります。いわゆる新旧スタイルのクラスがあり、やりたいことは新しいスタイルのもの。したがって、クラスはオブジェクトから継承する必要があります。

    class Operations(object):
        # ...
    

    彼らはついにPython3で古いスタイルのクラスのサポートを廃止することを決定し、オブジェクトから明示的に継承する必要はなくなりましたが、Python2ではそれに対処する必要があります。

まだいくつかのエラーまたは潜在的なエラーがありますが(close_connection()とは何ですか?)、良いスタートを切るには十分だと思います;)。幸運を。

于 2012-12-03T01:50:59.827 に答える