情况
我有一个flask应用程序,我需要一次插入多个值:
Mysql表有3列:name, email, password
表单有三个输入:姓名[],电子邮件[],密码[]
误差
TypeError: not enough arguments for format string
@app.route("/insert", methods=["POST", "GET"])
def insert():
cur = mysql.connection.cursor()
if request.method == 'POST':
names = request.form.getlist('name[]')
emails = request.form.getlist('email[]')
passwords = request.form.getlist('passwprd[]')
data = [names, emails, passwords]
for value in data:
cur.executemany('INSERT INTO users (name, email, password) VALUES (%s, %s, %s)',[value])
mysql.connection.commit()
cur.close()
flash('New record created successfully')
return redirect('/')
从代码来看,你似乎已经创建了错误的数据变量。
如果看这个例子:
names = ['peter', 'patty', 'micheal']
emails = ['example@gmail.com','test@gmail.com','foo@gmail.com']
passwords = ['asghgshsdgds','123','aasasa']
data =[names, emails, passwords]
print(data)
#[['peter', 'patty', 'micheal'],['example@gmail.com', 'test@gmail.com', 'foo@gmail.com'], ['asghgshsdgds', '123', 'aasasa']]
当我们做这样的事情时:
data = list()
if len(names) == len(emails) == len(passwords):
for i, val in enumerate(names):
data.append([names[i], emails[i], passwords[i]])
print(data)
# [['peter', 'example@gmail.com', 'asghgshsdgds'], ['patty', 'test@gmail.com', '123'], ['micheal', 'foo@gmail.com', 'aasasa']]
我认为这是主要问题。
所以解决方案是:
@app.route("/insert", methods=["POST", "GET"])
def insert():
cur = mysql.connection.cursor()
if request.method == 'POST':
names = request.form.getlist('name[]')
emails = request.form.getlist('email[]')
passwords = request.form.getlist('passwprd[]')
data = list()
if len(names) == len(emails) == len(passwords):
for i, val in enumerate(names):
data.append([names[i], emails[i], passwords[i]])
for value in data:
cur.executemany('INSERT INTO users (name, email, password) VALUES (%s, %s, %s)', [value])
mysql.connection.commit()
cur.close()
flash('New record created successfully')
return redirect('/')
编辑
经过进一步的研究,我认为可以进一步简化为:
@app.route("/insert", methods=["POST", "GET"])
def insert():
cur = mysql.connection.cursor()
if request.method == 'POST':
names = request.form.getlist('name[]')
emails = request.form.getlist('email[]')
passwords = request.form.getlist('passwprd[]')
data = list()
if len(names) == len(emails) == len(passwords):
for i, val in enumerate(names):
data.append([names[i], emails[i], passwords[i]])
stmt = 'INSERT INTO users (name, email, password) VALUES (%s, %s, %s)'
cursor.executemany(stmt, data)
mysql.connection.commit()
cur.close()
flash('New record created successfully')
return redirect('/')