Создайте таблицу MySQL с помощью ORM sqlalchemy из динамически меняющегося словаря.

Я хочу создать таблицу в своей базе данных MySQL из словаря, который будет динамически меняться с течением времени.

Словарь выглядит следующим образом, в котором указаны name + type столбцов, которые необходимо создать. Это файл настроек, который пользователь заполняет перед запуском проекта.

dct = {'ID':'String',
       'Benefit':'Float',
       'Premium':'Float'}

Я знаю, как создать это, жестко запрограммировав это в классе сопоставления следующим образом:

from sqlalchemy import create_engine, Column, String, Float
from sqlalchemy.ext.declarative import declarative_base

engine = create_engine('mysql+mysqldb://...')

Base = declarative_base()

class Table(base):
    __tablename__ = 'example'

    id = Column(String(30), primary_key=True)
    benefit = Column(Float)
    Premium = Column(Float)

Вопрос: как мне создать эти таблицы без жесткого кодирования имен и типов, но вычитая их из словаря.

Я также попытался построить класс из dict:

class Policy:

    def __init__(self, dictionary):
        for k, v in dictionary.items():
            setattr(self, k, v)

Но не знал, как реализовать это дальше.

Похожие вопросы:


person Erfan    schedule 24.09.2019    source источник
comment
не считается хорошей практикой пытаться динамически создавать переменные в области local или global из строки, которая кажется желаемой.   -  person gold_cy    schedule 24.09.2019
comment
Я понимаю, но в противном случае я не уверен, как решить эту проблему. Настройки хранятся в json, который заполнил пользователь, и таблица должна быть создана из файла. С указанными именами + типы.   -  person Erfan    schedule 24.09.2019
comment
Аналогичный вопрос № 2 - это то, что вам нужно, с добавлением перевода вашего dct в dict фактических экземпляров Column.   -  person Ilja Everilä    schedule 25.09.2019


Ответы (1)


отсюда SQLAlchemy создает динамические таблицы и столбцы

from sqlalchemy import MetaData, Table, Column, Integer, String

postgresql_db = engine(...)

post_meta = MetaData(bind=postgresql_db.engine)

post_meta.reflect(only=['customers'])

connection = postgresql_db.engine.connect()

columns_names = ['id', 'fname', 'lname', 'age']
columns_types = [Integer, String, String, Integer]
primary_key_flags = [True, False, False, False]
nullable_flags = [False, False, False, False]

test = Table('customers', post_meta,
             *(Column(column_name, column_type,
                      primary_key=primary_key_flag,
                      nullable=nullable_flag)
               for column_name,
                   column_type,
                   primary_key_flag,
                   nullable_flag in zip(columns_names,
                                        columns_types,
                                        primary_key_flags,
                                        nullable_flags)))

test.create()
person Ahmet Bilgin    schedule 15.03.2021