【问题标题】:sqlalchemy core with labels and joins postgres带有标签并加入 postgres 的 sqlalchemy 核心
【发布时间】:2017-01-20 20:27:39
【问题描述】:

使用 sqlalchemy 表达式语言,我希望从 2 个表中选择 id。因此我需要使用标签。如何解决这个问题。我需要相关表中的 id 和所有其他属性值。代码sn-p如下:

s1 = select([rt_issues.c.id.label('rt_issue_id'),
             rt_issues,
             queues.c.id.label('q_id'),
             queues,
            ]).\
    where(rt_issues.c.id == issue_id).\
    select_from(rt_issues.
    outerjoin(queues,
              rt_issues.c.queue_id == queues.c.id))
rs1 = conn.execute(s1)

错误日志:

“在 select 语句中尝试 'use_labels' 选项。” % 钥匙) InvalidRequestError:结果集中的列名“id”不明确!尝试 select 语句中的“use_labels”选项。

【问题讨论】:

    标签: python postgresql sqlalchemy


    【解决方案1】:

    我用SQLAlchemy tutorial做了同样的用例。

    >>> from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey
    >>> metadata = MetaData()
    >>> users = Table('users', metadata,
    ...     Column('id', Integer, primary_key=True),
    ...     Column('name', String),
    ...     Column('fullname', String),
    ... )
    
    >>> addresses = Table('addresses', metadata,
    ...   Column('id', Integer, primary_key=True),
    ...   Column('user_id', None, ForeignKey('users.id')),
    ...   Column('email_address', String, nullable=False)
    ...  )
    

    所有数据

    In [36]: s = select([users.c.id, users, addresses.c.id, addresses]).select_from(users.outerjoin(addresses))
    In [37]: conn.execute(s).fetchall()
    2017-01-20 19:13:11,218 INFO sqlalchemy.engine.base.Engine SELECT users.id, users.name, users.fullname, addresses.id, addresses.user_id, addresses.email_address
    FROM users LEFT OUTER JOIN addresses ON users.id = addresses.user_id
    2017-01-20 19:13:11,218 - sqlalchemy.engine.base.Engine - INFO - SELECT users.id, users.name, users.fullname, addresses.id, addresses.user_id, addresses.email_address
    FROM users LEFT OUTER JOIN addresses ON users.id = addresses.user_id
    2017-01-20 19:13:11,219 INFO sqlalchemy.engine.base.Engine {}
    2017-01-20 19:13:11,219 - sqlalchemy.engine.base.Engine - INFO - {}
    Out[37]:
    [(1, 'jack', 'Jack Jones', 1, 1, 'jack@yahoo.com'),
     (1, 'jack', 'Jack Jones', 2, 1, 'jack@msn.com'),
     (2, 'wendy', 'Wendy Williams', 3, 2, 'www@www.org'),
     (2, 'wendy', 'Wendy Williams', 4, 2, 'wendy@aol.com')]
    

    使用wherestatement

    In [42]: s = select([users.c.id, users, addresses.c.id, addresses]).where(users.c.id == 1).select_from(users.outerjoin(addresses, addresses.c.user_id == users.c.id))
    In [43]: conn.execute(s).fetchall()
    2017-01-20 19:23:41,153 INFO sqlalchemy.engine.base.Engine SELECT users.id, users.name, users.fullname, addresses.id, addresses.user_id, addresses.email_address
    FROM users LEFT OUTER JOIN addresses ON addresses.user_id = users.id
    WHERE users.id = %(id_1)s
    2017-01-20 19:23:41,153 - sqlalchemy.engine.base.Engine - INFO - SELECT users.id, users.name, users.fullname, addresses.id, addresses.user_id, addresses.email_address
    FROM users LEFT OUTER JOIN addresses ON addresses.user_id = users.id
    WHERE users.id = %(id_1)s
    2017-01-20 19:23:41,155 INFO sqlalchemy.engine.base.Engine {'id_1': 1}
    2017-01-20 19:23:41,155 - sqlalchemy.engine.base.Engine - INFO - {'id_1': 1}
    Out[43]:
    [(1, 'jack', 'Jack Jones', 1, 1, 'jack@yahoo.com'),
     (1, 'jack', 'Jack Jones', 2, 1, 'jack@msn.com')]
    

    不需要标签

    【讨论】:

    • 它没有给你任何错误说明“使用标签”吗?我使用的是 sqlalchemy core 0.11。
    • @user956424 我使用SQLAlchemy==1.1.4 并且没有“标签”错误。 sqlalchemy core 0.11 是什么意思?
    • 对不起,它应该被提到为 Flask v.0.11 和 sqlalchemy core v.1.0.8
    猜你喜欢
    • 2021-11-09
    • 1970-01-01
    • 2012-08-17
    • 2015-06-04
    • 1970-01-01
    • 2017-07-17
    • 2020-01-22
    • 1970-01-01
    • 2014-02-08
    相关资源
    最近更新 更多