sql - 我在更新我的 SQL 表时包含了值,但 SQL 仍然将我的值视为“无”??(如果我正确收到错误消息)
问题描述
我仍然是 CS 的初学者,我正在做 CS50 的最后一个项目。我正在使用烧瓶框架来构建 Web 应用程序。SQLite 用于处理数据库。
该网络应用程序旨在让用户阅读有关不同瑜伽课程的信息(并进行预订,这是一项尚未添加的功能)。它还应该让管理员在以管理员身份登录后,轻松 (1) 添加新的瑜伽课程和 (2) 更新网站中现有课程的详细信息。我现在遇到的问题与(2)有关。当我尝试使用 HTML 表单中的输入更新表格信息时,它总是显示错误消息。
sqlalchemy.exc.CompileError:不知道如何呈现文字 SQL 值:无
我数据库中的一张表是“时间表”,其中每一行代表一个班级。该表具有 id(用作主键)、日期、价格等列。
以管理员身份登录后,管理员可以在相关页面的 HTML 表单中输入信息以在时间表中添加新行,即添加新课程。我已经对其进行了测试,它应该可以正常工作。
但是,当尝试更新现有类的详细信息时,它总是显示错误 500(内部服务器错误)。我目前的做法是这样的:
让管理员进入“manageclass”页面,然后单击“Manage”以显示用于输入有关班级的新信息的 HTML 表单。
- 我以 2021-06-04 的课程为例。
表格的“ID”空白处已经填上了一个数字,这正是数据库“时间表”表中班级的“id”。它已被禁用,因此管理员不会意外更改它。
对于其他空白,管理员只需要在尝试更新时填写信息。例如,当管理员只想更改课程价格时,只需在“价格”空白处输入新数字即可。然后,单击“更改!” 提交表格。由于表单具有属性
action="/admin/manageclass"
和method="post"
,它会被转移到 my 中的相关路由application.py
。然后,该函数
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)
两者都不是无price
?class_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=int
(request.form.get
就像我上面所做的那样),它仍然不起作用。
我也试过request.values.get
了,还是不行。
我也尝试使用 将值转换为整数int()
,但效果不佳。
所以,问题还是没有解决。但希望我更接近最终解决方案。
解决方案
推荐阅读
- android - Android 8.1.0 前台服务通知问题
- http - 如何在 Nginx 的 http 消费者中解析 RabbitMQ 的 amqp 请求
- javascript - 我在数据库的表中插入值时遇到问题
- python - 删除列包含特定值(不是字符串)
- node.js - yarn run start 有效, npm run start 什么也不返回
- regex - 如何使用正则表达式提取特定实例?
- django - Django rest framework how to create 3 nested-serializer objects?
- reactjs - 反应“SecurityError:操作不安全。” 因为 webpackHotDevClient 在生产中?
- oracle - 要使用的 AWS RDS 数据泵目录
- haskell - 在 Haskell 中显示当地时间