Sqlalchemy динамически создает таблицу и сопоставленный класс

Учитывая набор имен столбцов и их типов, цель состоит в том, чтобы
для создания экземпляра таблицы и соответствующего сопоставленного класса.

Это связано с вопросом, опубликованным здесь: Создание динамического класса в SQLAlchemy .

Пока у меня есть следующее:

table = Table(tbl, metadata, *(Column(col, ctype, primary_key=pk, index=idx) for col, ctype, pk, idx in zip(attrs, types, primary_keys, indexes)) ) 

Это создает объект таблицы. Теперь мне нужно создать соответствующий класс.

 mydict={'__tablename__':tbl} cls = type(cls_name, (Base,), mydict) 

Это дает мне следующую ошибку:

ArgumentError: Mapper Mapper | persons_with_coord | t_persons_w_coord не может собрать столбцы первичного ключа для сопоставленной таблицы

Мой вопрос в том, как указать первичные ключи как часть создания класса. И после создания класса мне нужно вызвать mapper следующим образом:

 mapper(cls, table) 

One Solution collect form web for “Sqlalchemy динамически создает таблицу и сопоставленный класс”

Отображение mydict должно включать либо объект таблицы, либо указать, что таблица должна быть загружена из базы данных.

Это должно работать

 mydict={'__tablename__':tbl, '__table__': table} 

Это также должно работать

 mydict={'__tablename__':tbl, '__table_args__': ({'autoload':True},)} 

первичные ключи уже указываются при создании table . Нет необходимости указывать их снова при создании декларативного, однако, если это необходимо (скажем, для сложного ключа), оно должно быть указано в __table_args__ .

Преобразователь должен вызываться в декларативном классе. Однако у вновь созданного декларатора нет объекта метаданных. Добавление метаданных сделает динамически созданное декларативное поведение более похожим на регулярное декларативное, поэтому я бы рекомендовал поместить эту строку после создания класса

 cls.metadata = cls.__table__.metadata 

поэтому полное редактирование может быть:

 mydict={'__tablename__':tbl, '__table__': table} cls = type(cls_name, (Base,), mydict) cls.metadata = cls.__table__.metadata 
  • Как построить отношения «многие ко многим» с помощью SQLAlchemy: хороший пример
  • Установка начального значения автоинкремента SQLAlchemy
  • Подключение к базе данных с помощью SQLAlchemy
  • Создайте динамическую форму, используя флягу-wtf и sqlalchemy
  • DELIMITER / Создание триггера в SQLAlchemy
  • Flask-SQLAlchemy: несколько фильтров через одно отношение
  • Написание строки подключения, когда пароль содержит специальные символы
  • Как рассчитать кумулятивное скользящее среднее в Python / SQLAlchemy / Flask
  • Комплексный запрос (подзапросы, функции окна) с sqlalchemy
  • В чем разница между Model.query и session.query (Model) в SQLAlchemy?
  • SQLAlchemy Получение столбцов данных типов результатов запроса
  • Python - лучший язык программирования в мире.