#sqlite #sqlalchemy
Вопрос:
У меня есть простой скрипт python3, который запрашивает таблицу сотрудников с помощью Sqlalchemy orm(1.3), а базовая база данных-Sqlite3. Этот сценарий отлично работает, если в таблице сотрудников есть столбец с именем «Id«, но он не работает, если имя столбца «id«(в нижнем регистре). Есть ли способ заставить этот скрипт работать независимо от того, является ли имя столбца «Id» или «id«. В принципе, я хочу, чтобы этот скрипт работал независимо от учета регистра имен столбцов.
Вот код:
from sqlalchemy import create_engine, MetaData
from sqlalchemy.orm.query import Query
from sqlalchemy.ext.automap import automap_base
import sys
engine = create_engine(sys.argv[1])
metadata = MetaData(engine)
base = automap_base()
base.prepare(engine, reflect=True)
employee_table = base.classes["Employee"]
query = Query(employee_table).filter(employee_table.Id.in_(['100', '200']))
и я запускаю это из командной строки как python3 test.py sqlite:///temp.db
и это ошибка, которую я получаю:
Ошибка атрибута: объект типа «Сотрудник» не имеет атрибута «Идентификатор»
Ответ №1:
Общее решение см. на странице документации по перехвату определений столбцов.
Менее элегантно, но if
заявление тоже сработало бы:
if hasattr(employee_table, 'Id'):
id_attr = getattr(employee_table, 'Id')
elif hasattr(employee_table, 'id'):
id_attr = getattr(employee_table, 'id')
else:
raise ...
query = Query(employee_table).filter(id_attr.in_(['100', '200']))
Ответ №2:
имена таблиц и столбцов sqlite не зависят от регистра, поэтому вы столкнулись с этой проблемой. Это не проблема sqlalchemy, а скорее проблема sqlite.