Фильтрация данных из существующей таблицы с помощью psycopg2 + sqlalchemy

я использую psycopg2 & sqlalchemy для подключения к базе данных и извлечения информации из таблицы следующим образом:

def db_connection():
        eng = db.create_engine('my_URI')
        conn = eng.connect()
        return eng, conn

def table_conn():
    engine, connection = db_connection()
    metadata = db.MetaData()

    admin_table = db.Table(
        'myTableName',
        metadata,
        autoload=True,
        autoload_with=engine
    )
    return engine, connection, admin_table

def get_table_data(user_id):
    _, connection, table_data = table_conn()

    # first filter using user_id and sort the data by datetime column
    query = db.select([table_data]).where(
        table_data.columns.user_id == user_id,
    ).order_by(
        table_data.columns.created_at.desc()
    )
    result = connection.execute(query).fetchall()

    # 5th element is time
    # filtering the data to find data that has been saved at the same time
    # making it the latest data
    time = result[0][5]
    time_filtering_query = db.select([table_data]).where(
        table_data.columns.created_at == time
    )
    time_result = connection.execute(time_filtering_query).fetchall()
    return time_result

Функции: db_connection() & table_conn() подключаются к базе данных и таблице соответственно.

в get_table_data функции, я делаю следующее:

  1. Использовать user_id фильтровать таблицу
  2. Заказать стол в desc заказ на created_at столбец (который является 5-м столбцом таблицы)
  3. Извлеките первый created_at значение (которое result[0][5] в коде выше)
  4. И используйте это извлеченное значение, чтобы снова отфильтровать таблицу

В коде я жестко кодирую индекс столбца в result[0][5] часть. Есть ли способ изменить приведенный выше код, чтобы избежать жесткого кодирования значений и отфильтровать значения, если это возможно, на основе имен столбцов или каким-либо другим способом?

1 ответ
1

Вам следует избегать делать [0] после вашего запроса. Вместо этого добавьте .limit(1) в конце твоего select.

SQA поддерживает ссылки на именованные столбцы для отдельных кортежей результатов. Так что помимо поддержки [5], что (как вы определили) плохая идея — она ​​должна просто поддерживать .time предполагая, что это имя вашего столбца. Однако даже лучше — вместо того, чтобы выбирать все table_data — просто выберите только нужный столбец.

  • Большое спасибо за подсказку. Это было действительно полезно

    — Крысавчик

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *