【问题标题】:Cannot insert multiple rows into table无法在表中插入多行
【发布时间】:2021-10-26 11:15:36
【问题描述】:

情况

我有一个烧瓶应用程序,我需要一次向其中插入多个值:

Mysql 表有 3 列:name、email、password

表单有三个输入:name[]、email[]、password[]

错误

TypeError: 格式字符串的参数不足

守则

        @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('/')

【问题讨论】:

    标签: python mysql flask flask-mysql


    【解决方案1】:

    从代码中可以看出数据变量的创建错误。

    如果看这个例子:

    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('/')
    

    编辑

    在进一步investigation 之后,我相信它可以进一步简化为:

        @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('/')
    

    【讨论】:

    • 抱歉没有将表单数据插入mysql。
    • 抱歉我不明白你的评论?
    • 别担心,亲爱的。我对您的代码进行了一些更改。现在它正在工作。对于数据中的值: cur.executemany('INSERT INTO users (name, email, password) VALUES (%s, %s, %s)',[value])
    • 太好了,所以答案对你有用吗?
    • 是的。谢谢亲爱的。
    猜你喜欢
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-23
    相关资源
    最近更新 更多