Запрос ORM Sqlalchemy завершается неудачно, если фактическое имя столбца указано в нижнем регистре

#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.