不能在表中插入多行



情况

我有一个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('/')

最新更新