Ядро SQLalchemy объединяет и выбирает без повторяющихся полей - PullRequest
0 голосов
/ 23 февраля 2020

У меня есть две такие таблицы:

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. Как я могу получить тот, который я хочу? Это очень запутанно.

1 Ответ

0 голосов
/ 23 февраля 2020

Вы присоединяетесь к User и UserRole:

users.join(user_roles)

, поэтому появляется двойное 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'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...