我在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;')
答案 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)
成为查询字符串的一部分,而不是单独的参数。