Невозможно вставить несколько строк в таблицу

#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. ДА. Спасибо, дорогая.