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 
  • QuerySelectField работает на одном сервере, разбивается на другой с тем же кодом
  • SQLAlchemy - интроспекция ORM-классов / объектов
  • Получить связанные модели в SQLAlchemy
  • Может ли SQLAlchemy использоваться с Google Cloud SQL?
  • Прокси-сервер SQLAlchemy с двунаправленной связью
  • Поиск лучшей стратегии для SQLAlchemy bulk upsert
  • Объекты LocalProxy в Flask-SQLAlchemy
  • Как установить уровень изоляции транзакций в SQLAlchemy для PostgreSQL?
  • Проверка в SQLAlchemy
  • Как установить значения по умолчанию атрибута в декларации sqlalchemy?
  • Как использовать SQLAlchemy отражение с Sybase?
  • Python - лучший язык программирования в мире.