0

これは、データベースとの間でデータを挿入または選択する方法に関する非常に率直な質問ですか? コードをできるだけきれいに保とうとしているので、実際にクエリと挿入/更新を実行する方法は次のとおりです。

import sys
import MySQLdb
from ConfigParser import SafeConfigParser

#------------------------------------------------------------
# Select and insert
# this func should be called like:
# db_call('c:\dbconf.cfg','select * from something') 
# or insert / update statement.
#------------------------------------------------------------
def db_call(cfgFile, sql):
    parser = SafeConfigParser()
    parser.read(cfgFile)
    dbType = parser.get('database', 'db_type')
    db_host = parser.get('database', 'db_host')
    db_name = parser.get('database', 'db_name')
    db_user = parser.get('database', 'db_login')
    db_pass = parser.get('database', 'db_pass')

    con = MySQLdb.connect(host=db_host, db=db_name,
                          user=db_user, passwd=db_pass
                          )
    cur = con.cursor()
    try:
        try:
            cur.execute(sql)
            if re.match(r'INSERT|insert|UPDATE|update|DELETE|delete', sql):
                con.commit()
            else:
                data = cur.fetchall()
                resultList = []
                for data_out in data:
                    resultList.append(data_out)
                return resultList
        except MySQLdb.Error, e:
            con.rollback()
            print "Error "
            print e.args
            sys.exit(1)
        else:
            con.commit()
    finally:
        con.close()

しかし、この方法を使用すると、すべてのクエリをメインクラス内に保持する必要があり、テーブル構造に変更が発生した場合に問題になる可能性があります。

しかし、sp 呼び出しに行くと、sp 名とフィールドのみを渡すことで、コードをよりクリーンにすることができます。しかし、これにより、より具体的なケースに対して1つのpython関数が必要になる場合があります(例として、2、3、または4つの入力を受け取るspには、それぞれに異なるpython関数が必要です)

import sys
import MySQLdb
from ConfigParser import SafeConfigParser


#------------------------------------------------------------
# Select only!!!!!!
# this func should be called like:
# db_call('fn_your_function','field_a','field_b') 
# or insert / update statement.
#------------------------------------------------------------
def db_call(self, cfgFile, query):
    parser = SafeConfigParser()
    parser.read(cfgFile)
    dbType = parser.get('database', 'db_type')
    db_host = parser.get('database', 'db_host')
    db_name = parser.get('database', 'db_name')
    db_user = parser.get('database', 'db_login')
    db_pass = parser.get('database', 'db_pass')

    con = MySQLdb.connect(host=db_host, db=db_name,
                          user=db_user, passwd=db_pass
                          )
    cur = con.cursor()

    try:
        cur.callproc(query[0], (query[1],query[2]))
        data = cur.fetchall()
        resultList = []
        for data_out in data:
            resultList.append(data_out)
        return resultList
        con.close()
    except MySQLdb.Error, e:
        con.rollback()
        print "Error "
        print e.args
        sys.exit(1)

ここでこれを尋ねるのが適切かどうかはわかりませんが、投票して閉じる前に (その場合)、この種の質問をすることができる情報を返信してください:)

前もって感謝します。

4

1 に答える 1

1

オブジェクトの実装から DB のスキーマを抽象化することが目標である場合は、おそらく ORM/永続化フレームワークを検討する必要があります。Python にはいくつかあります。例として、SQLAlchemy は人気があり、人気のある Web フレームワークである Django には 1 つが組み込まれています。

于 2013-05-09T16:50:14.093 に答える