我正在根据CS50的网络系列创建一个应用程序,该程序要求我仅使用原始SQL查询而不是ORM。
我正在尝试提供一个搜索功能,用户可以在其中查找存储在数据库中的书籍列表。我想让他们查询名为“ books”的表格中的ISBN,标题,作者列
目前,它确实拍摄了“ GET”请求,没有问题,但是它没有返回任何数据,我认为问题出在我编写的SQL行中。
这是路线:
@app.route("/", methods=['GET','POST'])
def index():
# search function for books
if request.method == "GET":
searchQuery = request.form.get("searchQuery")
# return value from the search
searchResult = db.execute("SELECT isbn, author, title FROM books WHERE isbn LIKE '%"+searchQuery+"%' OR author LIKE '%"+searchQuery+"%' OR title LIKE '%"+searchQuery+"%'").fetchall()
# add search result to the list
session["books"] = []
# add the each result to the list
for i in searchResult:
session["books"].append(i)
return render_template("index.html", books=session["books"])
return render_template("index.html")
这是我的模板
<form method="GET">
<input type="text" name="searchQuery" class="searchTerm" placeholder="What are you looking for?">
<button type="submit" class="searchButton">submit</button>
</form>
<div>
<h3>
{% for book in books %}
{{ book }}
{% endfor %}
</h3>
</div>
任何人都可以发现问题吗?请注意,我应该利用原始SQL查询和会话。
我为您创建了一个具有完整解决方案的github :)
https://github.com/researcher2/stackoverflow_57120430
有两件事:
避免SQL注入
我建议在执行原始sql语句时使用绑定,我的代码反映了这一点。我花了很长时间尝试使它与您的陈述相符,然后才绊倒于此:
在LIKE中使用通配符替换Python
SQLite参数
基本上,您不能将绑定放在LIKE’%?%’内,因为引号会导致替换令牌被忽略。
相反,您只需要执行LIKE?并手动建立替代品。
使用会议
所有会话信息都是JSON序列化的,然后发送到客户端。在这种情况下,行记录不是JSON可序列化的。这对我来说是一个错误:
TypeError: Object of type 'RowProxy' is not JSON serializable
我可能不会在这里使用该会话,因为客户端不需要知道这一点,因为无论如何您将用信息来构建一个漂亮的html页面。只需使用python字典并将其传递给模板引擎即可。我的代码确实使用了会话,因为这是您开始的过程。
万一github崩溃了:
from flask import request, render_template, session
from app import app, db
@app.route("/", methods=['GET','POST'])
def index():
if request.method == "POST":
searchQuery = request.form.get("searchQuery")
print(searchQuery)
# Avoid SQL Injection Using Bindings
sql = "SELECT isbn, author, title \
FROM book \
WHERE isbn LIKE :x \
OR author LIKE :y \
OR title LIKE :z"
# I spent an hour wondering why I couldnt put the bindings inside the wildcard string...
# https://stackoverflow.com/questions/3105249/python-sqlite-parameter-substitution-with-wildcards-in-like
matchString = "%{}%".format(searchQuery)
stmt = db.text(sql).bindparams(x=matchString, y=matchString, z=matchString)
results = db.session.execute(stmt).fetchall()
print(results)
session["books"] = []
for row in results:
# A row is not JSON serializable so we pull out the pieces
book = dict()
book["isbn"] = row[0]
book["author"] = row[1]
book["title"] = row[2]
session["books"].append(book)
return render_template("index.html", searchedFor=searchQuery, books=session["books"])
return render_template("index.html")
问题内容: 我编写了此sql查询以在表中进行搜索: 该表包含以下行,例如: 太空公司。 温泉度假胜地。 温泉酒店。 备件。 没有主题关键字。 我想知道如何编辑此查询,以便它返回如下排序的结果: 2温泉度假村 3号温泉酒店 1太空公司 4备件 表示首先包含确切单词的项目,然后包含类似词语的项目。 问题答案: 就像是 应该可以。 实际上这会更好 FWIW我做了一些快速测试,如果“名称”在NONCLUS
在模型查询API不够用的情况下,你可以使用原始的sql语句。django提供两种方法使用原始sql进行查询:一种是使用Manager.raw()方法,进行原始查询并返回模型实例;另一种是完全避开模型层,直接执行自定义的sql语句。 警告 编写原始的sql语句时,应该格外小心。每次使用的时候,都要确保转义了参数中的任何控制字符,以防受到sql注入攻击。更多信息请参阅防止sql注入。 进行原始查询 r
问题内容: 使用Ebean创建的Postgres表,我想用手写语句查询这些表: 每个联接表代表我的模型类之一。查询执行得很好,但是我不知道如何进行: 如何使用Play 2.2执行查询。和伊豆?如何将此查询映射到可迭代对象?我是否需要创建一个包含查询中所有字段的Model类,还是可以使用某种HashMap?如何以安全的方式参数化查询? 问题答案: 要执行此查询,您需要使用RawSql类。您还必须创建
问题内容: 我有一个这样的表: 并想要一个这样的表,其中仅考虑商店A和B: 这是我们将在EXCEL中使用的SUMIFS函数: 我们可以用SQL编写什么? 考虑到这是一个简短的例子,数据库表有30多个部门和更多的日期。我正在使用脚本 …但是效率不高。感谢您的提示。 问题答案: 您的查询还可以,但可以进行一些改进: 这将删除,而对于则不需要。它将条件移到该子句上,因为它适用于所有行。并且,它通过在语句
问题内容: 我正在使用带有实体框架5的asp.net mvc3。我有.edmx文件,并能够使用linq或SP与数据库交互,但是我想运行一些原始sql语句。我正在尝试这样的事情: 是否有可能以这种方式执行sql查询?谢谢。 问题答案: 您可以执行以下类型的查询: 对实体类型的SQL查询,该查询返回特定类型的实体。 { } 非实体类型的SQL查询,该查询返回原始数据类型。 { var studentN
我正在尝试使用sqlalchemy执行原始sql查询,并想知道什么是“正确”的方法。 我的查询如下(目前): 我不喜欢的是字符串格式和缺乏任何参数处理(你好music_volume引号:-D)。 我试图遵循这个答案: 如何在SQLAlchemy flask应用程序中执行原始SQL 应用我读到的内容后,我的代码片段如下所示: 然而,我得到的错误,mv和ml是不能识别的参数。 如果我把我的代码片段改成