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 名称和字段。但有时这可能会导致我在更具体的情况下使用一个 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

如果您的目标是从对象的实现中抽象出数据库的模式,那么您可能应该查看 ORM/持久性框架。Python中有很多。例如,SQLAlchemy 很流行,而流行的 Web 框架 Django 内置了一个。

于 2013-05-09T16:50:14.093 回答