я использую 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
функции, я делаю следующее:
- Использовать
user_id
фильтровать таблицу - Заказать стол в
desc
заказ наcreated_at
столбец (который является 5-м столбцом таблицы) - Извлеките первый
created_at
значение (котороеresult[0][5]
в коде выше) - И используйте это извлеченное значение, чтобы снова отфильтровать таблицу
В коде я жестко кодирую индекс столбца в result[0][5]
часть. Есть ли способ изменить приведенный выше код, чтобы избежать жесткого кодирования значений и отфильтровать значения, если это возможно, на основе имен столбцов или каким-либо другим способом?
1 ответ
Вам следует избегать делать [0]
после вашего запроса. Вместо этого добавьте .limit(1)
в конце твоего select
.
SQA поддерживает ссылки на именованные столбцы для отдельных кортежей результатов. Так что помимо поддержки [5]
, что (как вы определили) плохая идея — она должна просто поддерживать .time
предполагая, что это имя вашего столбца. Однако даже лучше — вместо того, чтобы выбирать все table_data
— просто выберите только нужный столбец.
Большое спасибо за подсказку. Это было действительно полезно
— Крысавчик