【问题标题】:How to execute two SQL commands from a single Flask route如何从单个 Flask 路由执行两个 SQL 命令
【发布时间】:2018-10-16 22:17:48
【问题描述】:

我正在使用 Flask 创建一个网络应用程序。我在 MySql 数据库中有一些表。我想要的只是将一个表数据查询到一个表单并进行一些更改并将该数据插入另一个表。我有这条路线

我对代码进行了此更改。

@app.route('/attendance', methods=  ['GET','POST'])
def attendance():
    cur = connection.cursor()
    resultValue = cur.execute('''SELECT * FROM employee_data WHERE team = "ta15"''')
    if resultValue > 0:
        userDetails = cur.fetchall()
        return render_template('take_attendance.html', userDetails=userDetails)

    if request.method == 'POST':
        userDetails = request.form
        oracle_id = userDetails.getlist('oracle_id')
        name = userDetails.getlist('name')
        status = userDetails.getlist('status')
        remark = userDetails.getlist('remark')
        stmt= "insert into attendance( id, name, status, remark) VALUES(%s, %s, %s, %s)"
        for i , id in enumerate(id):
            cur.excutemany(stmt, (id[i], name[i], status[i], remark[i]))
            cur.commit()

$这是我的表格

{% for data in userDetails %}

    <tr>

        <td><input type="text" name="oracle_id" id="oracle_id" size="6" value="{{data.oracle_id}}"></td>

        <td><input type="text" name="name" id="name" size="20" value="{{data.name}}"></td>
        <td>
        <select name="status">

            <option value="-1">select..</option>
            <option value="A">A</option>
            <option value="TR" selected>1160</option>
            <option value="DR">1122</option>
            <option value="OR">1020</option>

        </select></td>
        <td>
        <select name="shift">
            <option value="-1">select..</option>
            <option value="Morning">7</option>
            <option value="Afternoon" selected>15:00</option>
        </select>
        </td>
        <td><textarea rows="1" cols="20" name="remark"></textarea></td>
    </tr>
{% endfor %}

通过将所需数据呈现给表单,查询工作正常,问题是它只在表单上插入第一个数据。无论如何我可以在一条路线内解决这个问题吗?或者有更好的方法吗?

【问题讨论】:

  • 你试过了吗:resultValue = cur.execute(''' ; '')
  • 我没有尝试过,但是来自“”的数据必须在上面的 HTML 表单上呈现,并插入回另一个带有额外 col 的表。你认为它会那样工作吗? @Mika72
  • 您似乎循环了一个循环变量,请将for i , id in enumerate(id): 更改为for i , id in enumerate(oracle_id):
  • 嘿冻糕。我相应地更改了代码,但和以前一样,总是从表单中插入第一条记录。 HTML表单有什么问题吗?

标签: python mysql flask


【解决方案1】:

首先,当你这样做时,你只需要一个数据块:

user = request.form
oracle_id = user['id']

改为使用 getlist

ids = request.form.getlist('id')
name = request.form.getlist('name')

然后:

stmt = "insert into today( id, name, status, remark) VALUES(%s, %s, %s, %s)"
for i, id in enumerate(ids):
    cur.executemany(stmt, (id, name[i],.......))
    cur.commit()

类似的东西,努力吧,我已经给你提示了。

其次,您可以在单个路由中使用 GET POST 来区分您的 SELECT 和 INSERT 请求。只需执行以下操作:

if request.method == 'POST':
     #insert sql part here
else:
     #get sql part here

建议:我强烈建议您使用模型,它可以让您的代码保持简单,并帮助您将凌乱的应用程序转换为干净的应用程序。您可以阅读有关Python SqlAlchemy 的信息,您可以使用一些简单的示例。

您可以使用这些模型调用查询和插入或更新函数来顺利处理。

【讨论】:

  • 谢谢Noor,我会尝试使用模型。但是,既然我以前从未使用过 SqlAlchemy,有没有办法以我的方式解决这个问题?
  • 嗨 Nova,我想了解更多关于您的问题的信息。首先请解释一下你的意思:“它只在表单上插入第一个数据”其次你的意思是什么:无论如何我可以解决这个问题在一条路线内? 您想合并这两条路线吗?然后您可以创建简单的检查它是 GET 还是 POST 请求。对于获取只是显示数据和发布或更新意味着你正在改变一些东西。
  • 嘿努尔。如您所见,我的 HTML 表单是从 emp_data 表生成的 id 和名称 cols 以及“团队”所做的选择,这意味着我有多个记录,但是当我在添加状态和备注后提交表单时,只有第一条记录会去到“今天”表。关于第二个,是的,你是对的,我需要合并两条路线并检查它是否 POST 将记录插入数据库。如果还不清楚,请告诉我。提前谢谢你。
  • 你的意思是如果你有多个idname并且你更新了它对应的状态和备注,那么Insert只会插入第一条记录吗?是吗?
  • 不,你是对的。这只会将一条记录插入数据库。因为“团队”包含近 15 条记录,但插入了单个值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-12
  • 2019-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-06
相关资源
最近更新 更多