#python #mysql #flask #flask-mysql
Вопрос:
Ситуация
У меня есть приложение flask, и мне нужно вставить в него сразу несколько значений:
Таблица Mysql имеет 3 столбца: имя, адрес электронной почты, пароль
Форма имеет три входных данных: имя [], адрес электронной почты [], пароль []
Ошибка
Ошибка типа: недостаточно аргументов для строки формата
Код
@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('/')
Ответ №1:
Глядя на ваш код, кажется, что переменная data была создана неправильно.
Если посмотреть на этот пример:
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('/')
Комментарии:
1. Извините, что не вставляю данные формы в mysql.
2. Извините, я не понимаю вашего комментария?
3. не волнуйся, дорогая. Я вношу некоторые изменения в ваш код. Теперь это работает. для значения в данных: cur.executemany(‘ВСТАВИТЬ В ЗНАЧЕНИЯ пользователей (имя, адрес электронной почты, пароль) (%s, %s, %s)’,[значение])
4. Отлично, значит, ответ сработал для вас?
5. ДА. Спасибо, дорогая.