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