SQLalchemy, как мне запросить из другой таблицы на основе дат из другой таблицы? - PullRequest
0 голосов
/ 09 мая 2020

Итак, я пытаюсь запросить количество попыток доступа, неудачных и успешных, на ежедневной основе. Это таблицы, которые я создал.

class SystemLog(Base):
    __tablename__ = 'SystemLog'

    ID = Column(Integer, primary_key=True)
    Date = Column(Text)
    Time = Column(Text)
    PID = Column(Integer)
    Message = Column(Text)


class Messages(Base):
    __tablename__ = 'Messages'

    ID = Column(Integer, primary_key=True)
    Message = Column(Text)
    AccessType = Column(Text)
    IP = Column(Integer)

Что я пробовал:

test = session.query(SystemLog.Date, Messages.AccessType, func.count(Messages.AccessType))\
        .join(Messages).filter(SystemLog.ID==Messages.ID)\
        .group_by(SystemLog.Date, Messages.AccessType).all()

Как выглядит строка SystemLog: enter image description here

Как выглядит строка сообщений:

enter image description here

Но это дает мне сообщение об ошибке, в котором говорится, что мне нужно использовать предложение ON. Есть несколько вещей, в которых я тоже не уверен. Правильно ли созданы мои таблицы и как мне их объединить?

При этом я не могу поместить все столбцы в одну таблицу. По крайней мере, AccessType и IP должны быть в отдельной таблице, а дата, время, PID и сообщение должны быть в одной таблице.

1 Ответ

1 голос
/ 09 мая 2020

На основе информации в комментариях:

  • , что существует взаимно однозначное отношение между таблицами
  • , что отношение между ними заключается в том, что содержимое столбец message в связанных строках идентичен (подразумевается, что каждое сообщение уникально)

запрос будет выглядеть так:

test = session.query(SystemLog.Date, Messages.AccessType, func.count(Messages.AccessType))\
              .join(Messages, SystemLog.message == Messages.message)\
              .group_by(SystemLog.Date, Messages.AccessType).all()

Что касается таблиц, Я бы попытался использовать более конкретные типы данных c, например Date должно быть sqlalchemy.Date или sqlachemy.DateTime. И присоединение к длинной строке, такой как message, может быть медленным, в идеале вы должны присоединиться к целочисленному значению.

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