SQL Ошибка внутреннего объединения sqlalchemy: «Не удалось найти столбец в строке для столбца« xxxx.id »» - PullRequest
0 голосов
/ 30 января 2020

Схематично: у меня есть эти таблицы [столбцы]

Flights [id, date, user_id, club_id, etc]
Clubs [id, etc]
Users [id, name, club_id, etc]

Я могу найти количество рейсов для каждого пользователя, количество рейсов для каждого клуба и т. Д. c.

Сложная задача для меня - найти количество (уникальных) пользователей в каждом клубе, которые отправили рейсы, в базе данных. Я уверен, что отправной точкой является

SELECT flights.club_id, users.name FROM flights
INNER JOIN users ON flights.club_id=users.club_id 

, а затем выполните count для этого.

Но я пытался реализовать вышеупомянутое соединение запросов с функциями sqlalchemy (v1.3.1) и с "текстом", например,

    query = db.session.query(Flight,User).from_statement(\
                  text('''SELECT flights.club_id, users.first_name FROM flights
                           INNER JOIN users ON flights.club_id=users.club_id  '''))

... Я получаю эту ошибку от любого из Метод:

"Could not locate column in row for column 'flights.id'"

Кто-нибудь знает, как это исправить? Я вижу очень мало онлайн об этой ошибке.

Или есть лучший способ получить количество пользователей в каждом клубе, у которых есть полеты в базе данных?


Вот полный трассировка ошибки:

  File "/home/bret/pycharm/helpers/pydev/_pydevd_bundle/pydevd_exec.py", line 3, in Exec
    exec exp in global_vars, local_vars
  File "<input>", line 1, in <module>
  File "/home/bret/.local/share/virtualenvs/skylinesC-0VgGNjgC/local/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 3186, in all
    return list(self)
  File "/home/bret/.local/share/virtualenvs/skylinesC-0VgGNjgC/local/lib/python2.7/site-packages/sqlalchemy/orm/loading.py", line 105, in instances
    util.raise_from_cause(err)
  File "/home/bret/.local/share/virtualenvs/skylinesC-0VgGNjgC/local/lib/python2.7/site-packages/sqlalchemy/util/compat.py", line 398, in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb, cause=cause)
  File "/home/bret/.local/share/virtualenvs/skylinesC-0VgGNjgC/local/lib/python2.7/site-packages/sqlalchemy/orm/loading.py", line 89, in instances
    for row in fetch
  File "/home/bret/.local/share/virtualenvs/skylinesC-0VgGNjgC/local/lib/python2.7/site-packages/sqlalchemy/orm/loading.py", line 508, in _instance
    tuple([row[column] for column in pk_cols]),
  File "/home/bret/.local/share/virtualenvs/skylinesC-0VgGNjgC/local/lib/python2.7/site-packages/sqlalchemy/engine/result.py", line 627, in _key_fallback
    % expression._string_or_unprintable(key)
NoSuchColumnError: "Could not locate column in row for column 'flights.id'"

1 Ответ

1 голос
/ 30 января 2020

Вы хотите посчитать уникальных пользователей для клубов в таблице «Полеты». Для подсчета вам не нужно объединять таблицы. По крайней мере, если предположение верно, что пары "user_id, club_id" в таблице FLights верны. Запрос может выглядеть следующим образом:

uniquesum = db.session.query(Flights.club_id, 
   func.count((Flights.user_id.distinct())).label('countusers') ).group_by(Flights.club_id)

Это возвращает только два столбца: идентификатор клуба (ов) и количество. Если вам нужна дополнительная информация из таблицы Клубов, вы можете присоединиться к этим таблицам, чтобы получить что-то, например, название Клуба ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...