SQLAlchemy关系/混合属性到特定的一对多实例

时间:2016-12-15 23:35:18

标签: python postgresql sqlalchemy

我试图创建一个混合属性或关系(可以工作)从"很多"中选择一个模型。一对多关系的一面。

How to set one to many and one to one relationship at same time in Flask-SQLAlchemy?的已接受答案对我不起作用,因为我需要在其他查询中使用表达式级别的构造。

相关模型详情如下:

class ItemIdentifierType(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    code = db.Column(db.String(12))
    priority = db.Column(db.Integer)

class ItemIdentifier(db.Model):
    id = db.Column(db.String(8), primary_key=True)
    type_id = db.Column(db.ForeignKey('item_identifier_type.id')
    type = relationship('ItemIdentifierType')

    item_id = db.Column(db.ForeignKey('item.id'))
    item = db.relationship('Item', back_populates='identifiers')

class Item(db.Model):
    id = db.Column(db.String(8), primary_key=True)
    name = db.Column(db.String(40))
    identifiers = db.relationship('ItemIdentifier', back_populates='instrument', lazy='dynamic')

    @hybrid_property
    def primary_identifier(self):
        return sorted(self.identifiers, key=lambda x: x.type.priority)[0]

    @primary_identifier.expression:
    def primary_identifier(cls):
        primary_identifiers = select([
            ItemIdentifier.item_id,
            ItemIdentifierType.code,
            ItemIdentifier.value
        ]).select_from(join(ItemIdentifier, ItemIdentifierType,
                       ItemIdentifier.type_id == ItemIdentifierType.id))\
          .order_by(ItemIdentifier.item_id,
                    ItemIdentifierType.priority.asc())\
          .distinct(ItemIdentifier.item_id)\
          .alias()

    # <<< psycopg2 throws the error shown below >>>
    return select([ItemIdentifierType.code, ItemIdentifier.value])\
        .select_from(primary_identifiers)\
        .where(primary_identifiers.c.item_id == self.id)

尝试使用sql表达式时抛出此错误:

(psycopg2.ProgrammingError) subquery in FROM must have an alias
LINE 2: FROM (SELECT item_identifier_type.code AS code, instru...
             ^
HINT:  For example, FROM (SELECT ...) [AS] foo.
 [SQL: 'SELECT code AS code, value AS value 
FROM (SELECT item_identifier_type.code AS code, item_identifier.value AS value 
FROM item_identifier_type, item_identifier, (SELECT DISTINCT item_identifier.item_id AS item_id, item_identifier.id AS id 
FROM item_identifier JOIN item_identifier_type ON item_identifier.type_id = item_identifier_type.id ORDER BY item_identifier.item_id, item_identifier_type.priority ASC, item_identifier.id) AS primary_identifiers, item 
WHERE primary_identifiers.item_id = item.id) ORDER BY item.name ASC']

以下查询提取了我之后的内容,没问题:

SELECT 
    DISTINCT ON (item_identifier.item_id)
    item_identifier.item_id, 
    item_identifier_type.code, 
    item_identifier.value
FROM item_identifier 
JOIN item_identifier_type 
     ON item_identifier.type_id = item_identifier_type.id 
ORDER BY 
    item_identifier.item_id, 
    item_identifier_type.priority ASC;

0 个答案:

没有答案