как сделать шаблон python-mysqldb? - PullRequest
1 голос
/ 15 февраля 2012

Я изучил некоторые основы Python-mysqldb, когда я хочу определить другую функцию пыток для запроса, я должен написать (connect, cursor ... try ..) несколько раз, поэтому я хочу создать шаблон, такой как jdbcTemplate (Java EE, Spring) мой код:

def DBV():
def templateFN(fn):
    logging.basicConfig(level=logging.INFO)
    log = logging.getLogger('DB')
    conn = MySQLdb.connect(user='root',passwd='247326',db='lucky',charset="utf8",cursorclass=MySQLdb.cursors.DictCursor);   
    cursor = conn.cursor() 
    def wrap(data=None):
        try:
            return fn(cursor=cursor,data=data)
            #conn.commit()
        except Exception ,e: 
            conn.rollback()
            log.error('%s, transaction rollback',e)
        finally:
            cursor.close()
            conn.close()

    return wrap  
class DB():
    @templateFN
    def insertTest(self,cursor,data=None):
        data = {
                'field':'this is a test',
                'name':'this is a name'
                }
        return cursor.execute('insert into test(field,name) values(%(field)s,%(name)s)',data)
return DB()

db = DBV ()

печать 'возвращаемого значения', db.insertTest (data = "ok")

Traceback (most recent call last):

Файл "D: \ WorkSpaces \ Aptana Studio 3 Workspace \ VLuck \ src \ com \ test.py", строка 164, в печати "возвращаемое значение", db.insertTest (data = "ok") TypeError: wrap() получил несколько значений для аргумента ключевого слова 'data'

, но не смог, как я должен сделать это правильно

1 Ответ

1 голос
/ 09 июля 2013

Вот решение, которое я придумал, вдохновленное другим ответом :

def connect_mysql(func):
    # Assign value of 'self' to be default func
    func.func_defaults = func.func_defaults[:-1] + (func,)
    func._cnx = mysql.connector.connect(**CONFIG)
    func._cursor = func._cnx.cursor()
    return func

@connect_mysql
def test(data, self=None):
    self._cursor.execute("SELECT %(c1)s", data)
    print(self._cursor.fetchall())

test({'c1': 1})
...