Mysqldb ошибка обновления typeerror 'str' объект не вызывается - PullRequest
1 голос
/ 17 марта 2012

Я создал базу данных с MySQLdb. В базе данных у меня есть таблица с именем студента со столбцами:

id(is int),
id_user(is int),
f_name(is str),
l_name(is str)

Я обновляю строку функцией Update. Мой код ниже:

    def UpdateUser(self,e):         
        self.checkid_user=int(self.updateid[0]) #ok there
        self.c2name=self.name.GetValue() #this is from a textctrl in wxpython
        self.c2lastname=self.lastname.GetValue()#this is from a textctrl in wxpython

        ne=self.c2name.encode("utf-8")#greek word
        fe=self.c2lastname.encode("utf-8")#greek word

        f="'"+str(ne)+"'"
        l="'"+str(fe)+"'"

        print f #ok
        print l #ok
        db=mdb.connect(host="localhost",use_unicode="True",charset="utf8",user="root",passwd="root",db="test")
        cursor = db.cursor()

        sql="""SELECT id_user FROM student"""

        try:
            # Execute the SQL command
            cursor.execute(sql)
            # Commit your changes in the database
            db.commit()
        except:
            # Rollback in case there is any error
            db.rollback()

        rows = cursor.fetchall()

        for row in rows:
            r=int(row[0])
            if r==self.checkid_user:                    #ok there
                sql2 = """UPDATE student
                SET f_name=%s,l_name=%s
                WHERE id_user=%s"""

               # Execute the SQL command
                cursor.execute(sql2(f,l,r))
        # Commit your changes in the database
                db.commit()

                db.rollback()
# disconnect from server
db.close()

Когда я запускаю функцию, я получаю следующую ошибку:

typeerror 'str' object is not callable

Я использую f и l для вызова, но ничего.
Мне нужна помощь, чтобы решить эту проблему. Спасибо!

1 Ответ

4 голосов
/ 17 марта 2012

Могут быть и другие проблемы, но давайте начнем с этого:

cursor.execute(sql2(f,l,r))

... не так.

Вам нужна запятая между аргументами:

cursor.execute( sql2, (f,l,r) )

Ваш код выглядит как вызов функции: this_is_how_we_call_a_func() <- обратите внимание на скобки! <br> Но sql2 содержит только строку, которая - как покажет свидетельство - не вызывается ...

>>> dir(sql2)
['__add__', '__class__', '__contains__', '__delattr__', ... other stuff

>>> def my_func(): pass
...
>>> dir(my_func)
['__call__', '__class__', '__closure__', '__code__', ... other stuff
 ^^^^^^^^^^
...