Как я могу создать класс/модель на основе уже существующей таблицы, не создавая класс/модель вручную. В моем случае это используется только на плоских таблицах без каких-либо отношений. Предполагая, что у меня есть следующая таблица в моей базе данных postgres:
id | brand_name | cloth_type
1 nike t-shirt
2 adidas t-shirt
3 nike skirt
Как я могу получить объект/экземпляр первой строки (id 1) без написания модели самостоятельно? Есть ли способ создать абстрактный класс, который генерируется «на лету» или где атрибуты добавляются на основе таблицы?
Я нашел это, но не мог понять, как это реализовать. https://docs.sqlalchemy.org/en/13/orm/extensions/automap.html
То, чего я хотел бы добиться, могло бы выглядеть примерно так (грубый код)
engine = db_connect(db_config_section) # creates engine based on config
file
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
abstract_class = ... # somehow generate abstract class
obj = session.query(abstract_class).get(1)
Спасибо за возможные ответы.
Редактировать: В связанном решении все еще есть класс, определенный с фиксированным именем класса и именем таблицы. Это не то, что я ищу. Код, который я хочу, должен быть независимым от одной таблицы. Например, код, который работает для таблицы ткани (как в моем примере), должен работать и для следующей таблицы (автомобиль):
id | brand_name | car_type | doors
1 bmw suv 4
2 ford pickup 2
3 fiat cuv 2
@IljaEverilä Спасибо за подсказку, но, к сожалению, это не решает мою проблему.
Вы проверили stackoverflow.com/a/48363732/2681632?
@IljaEverilä Да, но это не решило мою проблему, потому что кажется, что это другой случай, даже если он немного похож. Насколько я понял, это решение по-прежнему основано на написании собственной модели/класса. Модель MyClass по-прежнему фиксирована для одной и только одной таблицы, объявленной в вызове Tabel(). Таким образом, вам придется написать такую модель для каждой таблицы внутри БД. Вот чего я не хочу. Есть ли еще более абстрактное решение? Например. использовать функцию типа для создания класса на основе таблицы, а затем извлекать экземпляры с помощью sqlalchemy?
Это в значительной степени то, что делает связанный ответ, используя расширение automap. Он генерирует для вас классы моделей во время выполнения. Вы бы не написали код класса.
@IljaEverilä Ах, я думаю, что наконец-то обдумываю это. Предположим, я создал эту таблицу (объект?). Как я могу получить доступ к таблице через сеанс. Потому что это, естественно, не сработает: session.query(table_object).get(1). И спасибо за вашу помощь и терпение.
Хорошо, я решил это. Как грустно ИльяЭверила, решение в основном дается в сообщении stackoverflow, на которое он ссылается. Мне просто пришлось немного его подкорректировать. Я немного задержался в понимании этого, извините за это. Вот мое решение:
def create_class_by_table(table_name, engine):
table = Table(table_name, Base.metadata, autoload=True, autoload_with=engine)
class_name = table_name.capitalize()
attributes = {'__table__': table}
new_class = type(class_name, (Base,), attributes)
return new_class
new_class = create_class_by_table(table_name, engine) # table_name could be e.g. 'car'
obj = session.query(new_class).get(obj_id)
Если вы заинтересованы в первоначальном создании моделей на основе существующих таблиц, взгляните на stackoverflow.com/questions/1425412/….