使用mysqldb

时间:2016-03-22 22:29:23

标签: python mysql mysql-python

我在python中创建一个数据库类来帮助管理我的mysql数据库。

以下代码一直有效,直到最后一行

import MySQLdb

class Database:
    ...

    def insert(self, query):
        try:
            self.cursor.execute(query)
            self.connection.commit()
        except:
            self.connection.rollback()
    ...

db = Database()
db.insert('INSERT INTO items (title) VALUES ("tester2");')
mystring = "TEST"
db.insert('INSERT INTO items (title) VALUES (%s);', mystring)

最后一行导致错误:

    db.insert('INSERT INTO items (title) VALUES (%s);', mystring)
TypeError: insert() takes exactly 2 arguments (3 given)

我试图重新安排db.insert的内容中的内容,但我无法弄清楚语法。

例如我也试过这个,但它既不插入也不给出错误:

db.insert('''"INSERT INTO items (title) VALUES (%s);", mystring''')

我的问题是我可以正确使用%s插入语法,还是必须更改我的类的插入函数?

编辑1

我尝试过建议的行:

db.insert("INSERT INTO items (title) VALUES (%s);"% mystring)

db.insert('INSERT INTO items (title) VALUES {value};'.format(value=mystring))

既没有错误也没有将任何值输入数据库

编辑2

调用Database类的main的整个代码:

如果名称 ==" 主要":

db = Database()
mystring = 'Tester1'
mystring2 = 'Tester2'
db.insert('INSERT INTO items (title) VALUES ("Tester3");')  #works
db.insert("INSERT INTO items (title) VALUES (%s);" % mystring) #does not work
db.insert('INSERT INTO items (title) VALUES {value};'.format(value=mystring2)) #does not work
print db.query('SELECT * FROM items;')

2 个答案:

答案 0 :(得分:3)

修改

你遇到的问题不仅仅是传递一个论点。但也错误地调用了execute()

insert_stat ="INSERT INTO employees (emp_no, first_name, last_name, hire_date) VALUES (%s, %s, %s, %s)"
data = (2, 'Jane', 'Doe', datetime.date(2012, 3, 23))
# execute() takes 2 arguments, first is the statement as above, second argument is a tuple which contains all values
cursor.execute(insert_stmt, data)

在你的情况下,它应该是这样的: self.cursor.execute('INSERT INTO items (title) VALUES (%s);', (mystring,))

原始答案:

您只需传递一个参数query。因此,您可以将查询格式设置为一个字符串,如下所示:

'INSERT INTO items (title) VALUES {value};'.format(value=mystring)

变化 db.insert('INSERT INTO items (title) VALUES (%s);', mystring)db.insert('INSERT INTO items (title) VALUES {value};'.format(value=mystring))

答案 1 :(得分:0)

试试这个: t = [10, 20, 30, 20] F = TriScatteredInterp(x, y, t) 基本上,您希望db.insert("INSERT INTO items (title) VALUES (%s);" % mystring)成为查询字符串的一部分,而不是单独的参数。