首页 > 解决方案 > Sqlalchemy 相交和除外

问题描述

有人知道如何将这些原始 SQL 查询转换为 sqlalchemy 吗?

new_records = db.session.execute('SELECT issn_l, issn FROM issn_temp EXCEPT SELECT issn_l, issn FROM issn_to_issnl;')

removed_records = db.session.execute('SELECT issn_l, issn FROM issn_temp INTERSECT SELECT issn_l, issn FROM issn_to_issnl;')

我的模型如下:

class ISSNTemp(db.Model):
    __tablename__ = "issn_temp"
    issn_l = db.Column(db.String(9), nullable=False, primary_key=True)
    issn = db.Column(db.String(9), nullable=False, primary_key=True)


class ISSNToISSNL(db.Model):
    __tablename__ = "issn_to_issnl"

    issn_l = db.Column(db.String(9), nullable=False, primary_key=True)
    issn = db.Column(db.String(9), nullable=False, primary_key=True)
    created_at = db.Column(db.DateTime, default=datetime.datetime.utcnow)

我尝试使用联合,但效果不佳。

标签: postgresqlsqlalchemy

解决方案


我最近在附近构建了一个分层查询:

differential_select = union(
    select( *( [ deltakey ] + sncolumns + [ literal( 'SN' ).label( 'op' ) ] ) ).except_(
        select( *( [ deltakey ] + tncolumns  + [ literal( 'SN' ).label( 'op' ) ] ) )
    ),
    select(*( [ deltakey ] + tncolumns + [ literal( 'TN' ).label( 'op' ) ] ) ).except_(
        select( *( [ deltakey ] + sncolumns  + [ literal( 'TN' ).label( 'op' ) ] ) ) 
    )
)

将此应用于您的第一个查询,我得到:

select(
    issn_temp.c.issn_l,
    issn_temp.c.issn
).except_(
    select(
        issn_to_issn.c.issn_l,
        issn_to_issn.c.issn
    )
)

其中 issn_temp 和 issn_to_issn 指向 sqlalchemy.Table 的实例

另请注意,此处此处有更多详细信息。


推荐阅读