首页 > 解决方案 > 我在更新我的 SQL 表时包含了值,但 SQL 仍然将我的值视为“无”??(如果我正确收到错误消息)

问题描述

我仍然是 CS 的初学者,我正在做 CS50 的最后一个项目。我正在使用烧瓶框架来构建 Web 应用程序。SQLite 用于处理数据库。

该网络应用程序旨在让用户阅读有关不同瑜伽课程的信息(并进行预订,这是一项尚未添加的功能)。它还应该让管理员在以管理员身份登录后,轻松 (1) 添加新的瑜伽课程和 (2) 更新网站中现有课程的详细信息。我现在遇到的问题与(2)有关。当我尝试使用 HTML 表单中的输入更新表格信息时,它总是显示错误消息。

sqlalchemy.exc.CompileError:不知道如何呈现文字 SQL 值:无

我数据库中的一张表是“时间表”,其中每一行代表一个班级。该表具有 id(用作主键)、日期、价格等列。

以管理员身份登录后,管理员可以在相关页面的 HTML 表单中输入信息以在时间表中添加新行,即添加新课程。我已经对其进行了测试,它应该可以正常工作。

但是,当尝试更新现有类的详细信息时,它总是显示错误 500(内部服务器错误)。我目前的做法是这样的:

  1. 让管理员进入“manageclass”页面,然后单击“Manage”以显示用于输入有关班级的新信息的 HTML 表单。

    在此处输入图像描述

    • 我以 2021-06-04 的课程为例。
  2. 表格的“ID”空白处已经填上了一个数字,这正是数据库“时间表”表中班级的“id”。它已被禁用,因此管理员不会意外更改它。

  3. 对于其他空白,管理员只需要在尝试更新时填写信息。例如,当管理员只想更改课程价格时,只需在“价格”空白处输入新数字即可。然后,单击“更改!” 提交表格。由于表单具有属性action="/admin/manageclass"method="post",它会被转移到 my 中的相关路由application.py

  4. 然后,该函数manageclass()处理“ID”(如上所述预先填写)和表单中添加的其他信息。我的部分代码如下所示 - 假设我只需要更改课程价格,我只显示与课程价格相关的部分,以便您更轻松地阅读。

     @app.route("/admin/manageclass", methods=["GET", "POST"])
     @login_required
     def manageclass():
    
         if request.method == "GET":        
             # Check whether the user is admin ...
             # If yes, show the table for classes that can be managed ...
    
         else:        
             # Handle class ID
             class_id = request.form.get("class_id", type=int)        
             ...
    
             # Handle price (similar code for other items such as location)
             price = request.form.get("price", type=int)
             # When price is provided (similar code for other items such as location)
             if price:
                 db.execute("UPDATE timetable SET price = ? WHERE id = ?", price, class_id)        
             ...
    
             # Return to the manageclass page after successful information update ...
    

我认为上面的机制应该是简单明了的,但它最终还是搞砸了,因为它总是显示错误 500。当我查看我的 CS50 IDE 终端时,它显示以下错误消息。消息很长,所以我相信我们可以关注最后一行中最重要的一条信息:

sqlalchemy.exc.CompileError:不知道如何呈现文字 SQL 值:无`

但是,我很确定在运行时

db.execute("UPDATE timetable SET price = ? WHERE id = ?", price, class_id)

两者都不是无priceclass_id

ERROR: Exception on /admin/manageclass [POST]
Traceback (most recent call last):
File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 2447, in wsgi_app
response = self.full_dispatch_request()
File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 1952, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 1821, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/usr/local/lib/python3.9/site-packages/flask/_compat.py", line 39, in reraise
raise value
File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 1950, in full_dispatch_request
rv = self.dispatch_request()
File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 1936, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/home/ubuntu/project/application.py", line 35, in decorated_function
return f(*args, **kwargs)
File "/home/ubuntu/project/application.py", line 338, in manageclass
db.execute("UPDATE timetable SET price = ? WHERE id = ?", price, class_id)
File "/usr/local/lib/python3.9/site-packages/cs50/sql.py", line 21, in decorator
return f(*args, **kwargs)
File "/usr/local/lib/python3.9/site-packages/cs50/sql.py", line 178, in execute
_args = ", ".join([str(self._escape(arg)) for arg in args])
File "/usr/local/lib/python3.9/site-packages/cs50/sql.py", line 178, in <listcomp>
_args = ", ".join([str(self._escape(arg)) for arg in args])
File "/usr/local/lib/python3.9/site-packages/cs50/sql.py", line 475, in _escape
return __escape(value)
File "/usr/local/lib/python3.9/site-packages/cs50/sql.py", line 465, in __escape
sqlalchemy.types.NullType().literal_processor(self._engine.dialect)(value))
File "/usr/local/lib/python3.9/site-packages/sqlalchemy/sql/sqltypes.py", line 3101, in process
raise exc.CompileError(
sqlalchemy.exc.CompileError: Don't know how to render literal SQL value: None

我在网上搜索了很多页面,但遇到和我类似问题的朋友似乎并不多。希望我能在这里得到一些帮助,谢谢。:(

--- 第一次更新,提供更多信息 ---

我刚刚尝试更改以下代码:

db.execute("UPDATE timetable SET price = ? WHERE id = ?", price, class_id)

通过删除 WHERE 子句来执行以下操作:

db.execute("UPDATE timetable SET price = ?", price)

不再有如前所示的 SQL 编译错误。所以我认为问题与 WHERE 子句有关。当然没有 WHERE 是不可取的,因为所有类别的价格都会改变。但我希望这一小块信息对进一步调查该问题有所帮助。

--- 第二次更新 ---

我用我的代码做了一些其他的试验,当我将一个整数(而不是变量class_id)传递给我的 WHERE 子句时,没有错误:

db.execute("UPDATE timetable SET price = ? WHERE id = ?", price, 7)

因此,我认为问题出在变量 class_id 上,实际上是request.form.get("class_id", type=int). 其他一些在线资源建议request.form.get返回一个NoneType; 它也许可以解释为什么错误消息显示我的值是None.

但是,即使我再输入一个参数type=intrequest.form.get就像我上面所做的那样),它仍然不起作用。

我也试过request.values.get了,还是不行。

我也尝试使用 将值转换为整数int(),但效果不佳。

所以,问题还是没有解决。但希望我更接近最终解决方案。

标签: sqlsqliteflasksqlalchemycs50

解决方案


推荐阅读