按关联代理排序:无效的 sql

Posted

技术标签:

【中文标题】按关联代理排序:无效的 sql【英文标题】:Order by association proxy: invalid sql 【发布时间】:2019-12-18 09:56:23 【问题描述】:

我想将相关模型的列附加到另一个模型,并像使用任何其他 sqlalchemy 列属性一样使用它。正如docs 中提到的,association_proxy 使其易于使用。

from sqlalchemy.ext.associationproxy import association_proxy
from app import db


class User(db.Model):
    id = db.Column(...)
    name = db.Column(...)

class Book(db.Model):
    author_id = db.Column(...)
    author = db.relationship('User', foreign_keys=[author_id])
    author_name = association_proxy('author', 'name')

但是当我打电话给Book.query.order_by(Book.author_name.asc()).all() 时,我得到了这个:

psycopg2.errors.SyntaxError: syntax error at or near "ASC"
LINE 4: ...user.id = book.author_id AND user.name ASC)

Sqlalchemy 生成 EXISTS 语句:

...
EXISTS (SELECT 1
FROM user
WHERE user.id = book.author_id AND user.name ASC)

那么如何正确使用关联属性的排序?

【问题讨论】:

【参考方案1】:

在这种情况下,最好使用column_property

Base = declarative_base()


class User(Base):
    __tablename__ = 'user'

    id = Column(Integer(), primary_key=True)    
    name = Column(Unicode())


class Book(Base):
    __tablename__ = 'book'
    id = Column(Integer(), primary_key=True)
    author_id = Column(Integer(), ForeignKey('user.id'), nullable=False)
    author = relationship('User')


Book.author_name = column_property(select([User.name]).where(User.id == Book.author_id))


# sample ORM query
books = session.query(Book).order_by(Book.author_name)

【讨论】:

此选择语句返回所有拥有现有书籍的用户,我收到此错误:(psycopg2.errors.CardinalityViolation) more than one row returned by a subquery used as an expression。有没有办法按特定的 Book 对象 id 过滤? 哪个选择语句?我已经使用示例查询更新了示例。 我的意思是在 column_property 中选择。像这样:` SELECT user.name FROM user, book WHERE user.id = book.id 产生:1. Name1, 2. Name2, ... ` 我相信这个例子现在可以正常工作了。您收到任何错误消息吗?

以上是关于按关联代理排序:无效的 sql的主要内容,如果未能解决你的问题,请参考以下文章

sql server 2008 代理服务提供的凭据无效

安装sql2008时提示sql代理服务提供凭据无效

mybatis动态sql排序无效

安装SQL2008出现了问题,提示SQLserver代理服务器提供的凭据无效,请为SQLserver代理服务器提供有效的账户

DB2 SQL 错误:SQLCODE=-901,SQLSTATE=58004,SQLERRMC=无效的排序规则 ID,驱动程序=4.21.29

使用nginx代理header无效不转发