Python查询sql db中的最后一条记录,但返回空白记录
Posted
技术标签:
【中文标题】Python查询sql db中的最后一条记录,但返回空白记录【英文标题】:Python querying last record in sql db, but returning blank record 【发布时间】:2022-01-21 12:14:46 【问题描述】:我正在使用 Python Flask 和 SQLAlchemy 创建一个简单的 Web 应用程序,该应用程序将用户输入的图书 ISBN(ISBN = 唯一的图书 ID)存储在 db 表中,然后查询该记录以供稍后在 API 中使用称呼。它使用 API 响应将图书信息存储在另一个表中。
我已确认这些表正确地存储了数据。我已经确认查询 ISBN 表会返回正确的值。但是当我尝试将查询存储为 Python 变量并在 API 调用中使用它时,它的行为总是像变量 == ''。
这是数据库设置:
class Isbn(db.Model):
id = db.Column(db.Integer, primary_key=True)
isbn = db.Column(db.Integer, nullable=False)
def __init__(self, isbn):
self.isbn = isbn
这是查询 ISBN 表的路径,在 API 调用中使用 ISBN 记录,然后将该数据的结果存储到另一个表中:
@app.route('/addbook', methods=['POST', 'GET'])
def addbook():
title = "Addbook"
if request.method == 'POST':
isbn = db.session.query(Isbn.isbn).order_by(Isbn.id).first()
r = urllib.request.urlopen(f'https://www.googleapis.com/books/v1/volumes?q=isbn:isbn')
data = json.load(r)
btitle = data["items"][0]["volumeInfo"]["title"]
author = data["items"][0]["volumeInfo"]["authors"][0]
pagecount = data["items"][0]["volumeInfo"]["pageCount"]
newbook = Books(title=btitle, author=author, pagecount=pagecount)
db.session.add(newbook)
db.session.commit()
return redirect('/searchbook')
在应用程序的早期,我使用了在 API 调用中使用用户输入的相同方法,并且效果很好。我在这里去掉了错误处理,但错误是说 API 响应没有正文,经过研究我发现这是因为 ISBN 表查询返回 ''。
【问题讨论】:
代替db.session.query(Isbn.isbn).order_by(Isbn.id).first()
试试db.session.query(Isbn.isbn).order_by(Isbn.id).scalar()
@GordThompson 它给了我这个错误: sqlalchemy.exc.MultipleResultsFound: 当恰好需要一个时发现了多行。我只需要一个结果,即记录中的 ISBN 值。
嗯。好的,那… .order_by(Isbn.id).first().isbn
怎么样?
@GordThompson 成功了!!你能解释一下为什么它会起作用,这样我下次就不会再头疼了吗?谢谢!
【参考方案1】:
即使在查询单个元素时,.first()
也会返回一个 SQLAlchemy Row
对象,其行为非常类似于命名元组
isbn = session.query(Isbn.isbn).order_by(Isbn.id).first()
print(type(isbn)) # <class 'sqlalchemy.engine.row.Row'>
print(isbn) # (9783161484100,)
请注意,字符串表示包括括号和逗号,因此将其嵌入到 URL 中会产生
print(f"https://…?q=isbn:isbn") # https://…?q=isbn:(9783161484100,)
由于意外字符,这可能无法正常工作。
由于Row
对象的行为类似于命名元组,我们可以通过名称访问它们的元素,例如my_row.my_column
,因此我们可以使用
isbn = session.query(Isbn.isbn).order_by(Isbn.id).first().isbn
print(type(isbn)) # <class 'int'>
print(isbn) # 9783161484100
print(f"https://…?q=isbn:isbn") # https://…?q=isbn:9783161484100
【讨论】:
以上是关于Python查询sql db中的最后一条记录,但返回空白记录的主要内容,如果未能解决你的问题,请参考以下文章