Python 查询 sql 数据库中的最后一条记录,但返回空白记录
Python querying last record in sql db, but returning blank record
我正在使用 Python Flask 和 SQLAlchemy 创建一个简单的 Web 应用程序,该应用程序将用户输入的图书 ISBN(ISBN = 唯一图书 ID)存储在数据库 table 中,并且然后稍后查询该记录以在 API 调用中使用。它使用 API 响应将图书信息存储在另一个 table.
中
我已确认 table 正在正确存储数据。我已确认查询 ISBN table returns 的值正确。但是当我尝试将查询存储为 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 table 的路径,在 API 调用中使用 ISBN 记录,然后将该数据的结果存储在另一个 table 中:
@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 table 查询 returns ''。
即使在查询单个元素时,.first()
returns 一个 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 Flask 和 SQLAlchemy 创建一个简单的 Web 应用程序,该应用程序将用户输入的图书 ISBN(ISBN = 唯一图书 ID)存储在数据库 table 中,并且然后稍后查询该记录以在 API 调用中使用。它使用 API 响应将图书信息存储在另一个 table.
中我已确认 table 正在正确存储数据。我已确认查询 ISBN table returns 的值正确。但是当我尝试将查询存储为 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 table 的路径,在 API 调用中使用 ISBN 记录,然后将该数据的结果存储在另一个 table 中:
@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 table 查询 returns ''。
即使在查询单个元素时,.first()
returns 一个 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