Автоматически генерировать класс/модель на основе уже существующей таблицы

Как я могу создать класс/модель на основе уже существующей таблицы, не создавая класс/модель вручную. В моем случае это используется только на плоских таблицах без каких-либо отношений. Предполагая, что у меня есть следующая таблица в моей базе данных 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

Если вы заинтересованы в первоначальном создании моделей на основе существующих таблиц, взгляните на stackoverflow.com/questions/1425412/….

Ilja Everilä 28.05.2019 19:43

@IljaEverilä Спасибо за подсказку, но, к сожалению, это не решает мою проблему.

Wikktor 29.05.2019 13:46

Вы проверили stackoverflow.com/a/48363732/2681632?

Ilja Everilä 29.05.2019 13:50

@IljaEverilä Да, но это не решило мою проблему, потому что кажется, что это другой случай, даже если он немного похож. Насколько я понял, это решение по-прежнему основано на написании собственной модели/класса. Модель MyClass по-прежнему фиксирована для одной и только одной таблицы, объявленной в вызове Tabel(). Таким образом, вам придется написать такую ​​модель для каждой таблицы внутри БД. Вот чего я не хочу. Есть ли еще более абстрактное решение? Например. использовать функцию типа для создания класса на основе таблицы, а затем извлекать экземпляры с помощью sqlalchemy?

Wikktor 29.05.2019 14:29

Это в значительной степени то, что делает связанный ответ, используя расширение automap. Он генерирует для вас классы моделей во время выполнения. Вы бы не написали код класса.

Ilja Everilä 29.05.2019 14:41

@IljaEverilä Ах, я думаю, что наконец-то обдумываю это. Предположим, я создал эту таблицу (объект?). Как я могу получить доступ к таблице через сеанс. Потому что это, естественно, не сработает: session.query(table_object).get(1). И спасибо за вашу помощь и терпение.

Wikktor 29.05.2019 15:05
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
6
178
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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)

Другие вопросы по теме