склянка sqlalchemy - динамически генерировать модель данных на основе столбцов в базе данных - PullRequest
2 голосов
/ 09 марта 2019

Есть ли способ динамически генерировать модель БД на основе столбцов в таблице базы данных для Flask SQLAlchemy?

У меня есть приложение для отображения данных из таблицы базы данных, но имя столбца будет время от времени меняться и нарушать работу моего приложения. Я хотел бы иметь способ динамически генерировать модель данных на основе фактических имен столбцов в базе данных.

В настоящее время я явно объявляю все столбцы, как показано ниже.

class MyDbModel(db.Model):

    __tablename__ = 'my_table'

    id = db.Column('id', db.NVARCHAR(length=300), primary_key=True)
    name= db.Column('name', db.NVARCHAR(length=300),
                          nullable=True)

Я не очень знаком с sqlalchamy, я пробовал следующее, но получаю ошибку, как показано ниже, и я не уверен, что это правильный способ сделать это.

could not assemble any primary key columns for mapped table

from sqlalchemy import Table, Column
from sqlalchemy.orm import mapper

    db = SQLAlchemy()

    class MyDbModel(db.Model):
        __tablename__ = 'my_table'

        def __init__(self):
            #helper function to get column headers of a db table
            table_cols = get_headers_or_columns(
                'my_table'
            )
            t = Table(
                'my_table', db.metadata,
                Column('id', db.NVARCHAR(length=300), primary_key=True),
                *(Column(table_col, db.NVARCHAR(length=300)) for table_col in table_cols)
            )

            mapper(self, t)

Любая помощь приветствуется!

1 Ответ

0 голосов
/ 12 марта 2019

Я понял это на случай, если кому-то понадобится.Это действительно просто, используйте вспомогательную функцию, чтобы получить заголовки столбцов вашей таблицы, а затем просто используйте setattr, чтобы установить атрибуты класса.

from app import db

class MyDbModel(db.Model):
        pass

def map_model_attrs(model, table):
    """
    :param model: your db Model Class
    :param table your db table name
    """

    table_cols = get_headers_or_columns(table)

    for col in table_cols:
        setattr(
            model, col, db.Column(col, db.NVARCHAR(length=300),
                                  nullable=True)
        )

map_mode_attrs(MyDbModel, 'my_table')
...