【问题标题】:Create MySQL table with sqlalchemy ORM, from dynamically changing dictionary使用 sqlalchemy ORM 从动态更改的字典创建 MySQL 表
【发布时间】:2020-01-24 13:54:20
【问题描述】:

我想在我的 MySQL 数据库中创建一个表,该表来自一个随时间动态变化的字典

字典如下所示,其中指定了要创建的列的name + type。这是用户在项目运行之前填写的settings文件。

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)

但不知道如何进一步实施。

类似问题

【问题讨论】:

  • 尝试从字符串动态创建 localglobal 范围内的变量被认为是不理想的做法,这似乎是所需的行为
  • 我明白,但我不知道如何解决这个问题。这些设置存储在用户填写的json 中,并且必须从文件中创建表。具有指定的名称 + 类型。
  • 您需要类似的问题 #2,此外还需要将您的 dct 转换为实际 Column 实例的字典。

标签: python mysql orm sqlalchemy class-constructors


【解决方案1】:

从这里SQLAlchemy create dynamic tables and columns

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()

【讨论】:

    猜你喜欢
    • 2020-05-10
    • 2010-11-01
    • 2017-12-09
    • 1970-01-01
    • 2012-03-24
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 2017-02-26
    相关资源
    最近更新 更多