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中的最后一条记录,但返回空白记录的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 如何查询最后一条记录

SQL查询从链接表中检索最后一条记录[重复]

当值与 SQL Server 中的最后一条记录之间存在特定差距时如何选择值

返回子查询中的最后一条记录 - MySQL

如何从 sql 查询中获取第一条和最后一条记录?

Microsoft SQL 查询 - 从第二个表返回最后一条记录