【问题标题】:SQLalchemy core join and select without duplicate fieldsSQLalchemy 核心连接和选择没有重复的字段
【发布时间】:2020-02-23 15:58:37
【问题描述】:

我有两张这样的桌子:

class UserRole(tyrande.BaseModel):
  """SQLAlchemy UserRole model definition."""

  __tablename__ = 'user_role'

  id = sa.Column(sa.Integer, autoincrement=True, index=True, primary_key=True)
  type = sa.Column(sa.String, nullable=False, unique=True)


class User(tyrande.BaseModel):
  """SQLAlchemy User model definition."""

  __tablename__ = 'user'

  id = sa.Column(sa.Integer, autoincrement=True, index=True, primary_key=True)
  name = sa.Column(sa.String, index=True, nullable=False)
  email = sa.Column(sa.String, unique=True, index=True, nullable=False)
  password = sa.Column(sa.String, nullable=False)
  birth_date = sa.Column(sa.Date, nullable=False)
  role_id = sa.Column(
      sa.Integer, sa.ForeignKey("user_role.id"), server_default='1')
  is_verified = sa.Column(
      sa.Boolean, server_default=sa.sql.expression.false(), nullable=False)
  create_date = sa.Column(
      sa.DateTime(timezone=True),
      server_default=sa.sql.func.now(), nullable=False)


users = User.__table__
user_roles = UserRole.__table__

我想进行以下查询:

users.join(user_roles).select().where(users.c.email == 'dummy@dummy.com')

查询的执行给了我以下结果:

<Record id=11 name='standard_user' email='dummy@dummy.com' password='$2b$12$gxeX1JQgTOQp45siGAwbhOYUQdi//YabPH.aG318ZTjwQs94/1k2K' birth_date=datetime.date(2020, 2, 23) role_id=1 is_verified=False create_date=datetime.datetime(2020, 2, 23, 15, 35, 8, 871941, tzinfo=datetime.timezone.utc) id=1 type='STANDARD'>

它有两个名为“id”的字段,一个来自users 表,第二个来自user_roles。我怎样才能得到我想要的?这很混乱。

【问题讨论】:

    标签: python sql python-3.x postgresql sqlalchemy


    【解决方案1】:

    您将加入UserUserRole

    users.join(user_roles)
    

    这就是出现双 id 的原因 - 两个实体都有 id。如果您运行这样的查询(连接具有相同列名的两个表),结果将是相同的。

    第一个 id 来自第一个表 (users),第二个 - 来自第二个 (user_roles)。

    我不确定,你想做什么,如果你只想要User实体,那么运行:

    select([users]).select_from(users.join(user_roles).where(users.c.email == 'dummy@dummy.com'))
    

    或者这样省略第二个id

    select([users, user_roles.c.type]).select_from(users.join(user_roles).where(users.c.email == 'dummy@dummy.com'))
    

    【讨论】:

    • 如果我想得到类似&lt;Record id=11 name='standard_user' ... role_id=1 role_type='STANDARD'&gt; 的东西怎么办?
    • @AlvaroGarcia 没问题,使用这个选择:select([users, user_roles.c.type])
    • 我收到以下错误sqlalchemy.exc.ArgumentError: SQL expression object expected, got object of type &lt;class 'list'&gt; instead 我正在使用编码/数据库项目进行如下查询:data = await tyrande.db.fetch_one(query)
    • @AlvaroGarcia 使用 tyrande.db.fetch_row
    • 执行select([users, user_roles.c.type]时我仍然收到sqlalchemy.exc.ArgumentError: SQL expression object expected, got object of type &lt;class 'list'&gt; instead这个错误
    猜你喜欢
    • 1970-01-01
    • 2017-05-02
    • 2016-06-24
    • 2013-02-22
    • 2018-12-19
    • 2021-08-04
    • 2013-07-04
    • 2021-09-09
    • 2023-03-06
    相关资源
    最近更新 更多