首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用PostgresSQL -sqlalchemy.exc.ProgrammingError时出错:无法适应“RowProxy”类型

使用PostgresSQL -sqlalchemy.exc.ProgrammingError时出错:无法适应“RowProxy”类型
EN

Stack Overflow用户
提问于 2019-08-01 16:39:55
回答 1查看 2.8K关注 0票数 1

我正在创建一个在线教程的书评网站。似乎我正在将一些倾斜的值user_id传递到reviews表中。

user_id应该是一个纯整数(Smallint),但是在错误消息中,它显示为(2,),我想知道这是否是这个错误的主要原因。

在这条路线上,我要做的是显示一本书的详细页面,并让用户提交一份评论。因此,我从存储的会话中获取username,并使用它从users表中提取user_id,并将其作为外键值user_id插入review表中。

,这是我的路线,与问题有关。

代码语言:javascript
复制
@app.route('/book/<string:isbn>', methods = ['POST','GET'])
def book(isbn):
    #import columns from database 
    res = db.execute("SELECT * FROM books WHERE isbn = :isbn", {"isbn": isbn}).fetchone()
    #import api from Goodreads (stats) 
    r = requests.get("https://www.goodreads.com/book/review_counts.json", params={"key": "L3FHyOR3IhCo3kctcUz3zg", "isbns": isbn})
    if r.status_code != 200:
      raise ValueError
    reviews_count=r.json()["books"][0]["reviews_count"]
    average_rating=r.json()["books"][0]["average_rating"]
    username = session.get("username")
    if request.method == "POST":
        review = request.form.get("comment")
        rating = request.form.get("rating")
        date = datetime.now()
        user_id = db.execute("SELECT id FROM users WHERE username = :username",{"username":username}).fetchone()
        db.execute("INSERT INTO reviews (user_id, review, rating, date) VALUES (:user_id, :review, :rating, :date)", {"date":date, "review":review, "rating":rating, "user_id":user_id})
        db.commit()
    return render_template("book.html", reviews_count = reviews_count, average_rating = average_rating, email = username)

,这是错误消息!

请看代码,请让我知道你认为问题在哪里发生。耽误您时间,实在对不起!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-01 19:00:31

execute()总是为每一行返回一个列值的元组,即使您只选择一个列。更准确地说,它实际上是一个元组的包装器,称为RowProxy (或返回多行时的ResultProxy ),它为您提供了更多的功能。我会稍微修改变量名,以强调:

代码语言:javascript
复制
result = db.execute("SELECT id FROM users WHERE username = :username",{"username":username}).fetchone()
result.columns() # returns ('id',) - so you can create a dict of key value pairs
user_id = result[0]

虽然你也可以保持简洁(注意逗号)

代码语言:javascript
复制
user_id, = db.execute("SELECT id FROM users WHERE username = :username",{"username":username}).fetchone()

代码语言:javascript
复制
user_id = db.execute("SELECT id FROM users WHERE username = :username",{"username":username}).fetchone()[0]

更新

我认为获得多列的最干净的方法是执行我在内联注释中所写的操作,即创建一个键值对的块。

代码语言:javascript
复制
result = db.execute("SELECT * FROM books WHERE isbn = :isbn", {"isbn": isbn}).fetchone()

# zip takes two lists and returns them as a list of tuples, combining
# the nth element of the first list and the nth element of the second list,
# so essentially it creates a list of key value pairs for you
book = {column: value for (column, value) in zip(result.columns(), result)}
book_id = book['id']

或者在多行的情况下:

代码语言:javascript
复制
result = db.execute("SELECT * FROM books WHERE author_id = :author_id", {"author_id": author_id}).fetchall()

books = [
    {column: value for (column, value) in zip(result.columns(), row)}
    for row in result
]
book_ids = [book['id'] for book in books]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57313491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档