【问题标题】:SQLalchemy: multiple tables one schema, and dynamically creating tables at startupSQLalchemy:多表一个模式,并在启动时动态创建表
【发布时间】:2016-05-10 03:40:49
【问题描述】:

我正在构建一个 Flask 应用程序,它在启动时应该读取一些 tsv 文件,每个文件都有相同的架构,将它们放在表中(每个文件一个),然后用户将指定哪个表/file 他们想要查询的,以及一些键。

我不确定如何执行此操作,但最好的方法似乎是指定一个架构,然后在应用启动后读取文件并为每个文件动态创建表。我在 SQLalchemy 文档中找不到任何地方提到如何多次使用相同的模式。也许我需要扩展我的模式类,但我不确定如何在启动时执行此操作。

提前致谢!

-- 编辑--

看起来这回答了我的一半问题: Flask-SQLAlchemy. Create several tables with all fields identical

所以我现在的问题是:您可以在 Flask 中执行上述操作,并且您可以在应用程序启动时执行此操作吗?

【问题讨论】:

    标签: flask sqlalchemy flask-sqlalchemy


    【解决方案1】:

    您可以采取两种方法。

    1. 子类化 - 你为模式创建一个基本的 Mixin 并为每个具体的表子类化它。如果您预计将来不同表的架构可能会出现分歧,这种方法很有用。如果只需要在一个表中添加新字段,则只能在子类中添加。 (变量 db、Model 等来自flask sqlalchemy quickstart

      class BaseMixin(object):
           name = db.Column(String(80), unique=True)
           field2 = db.Column ...
      
      class SubClass1(BaseMixin, db.Model)         
           pass
      
      class Subclass2(BaseMixin, db.Model)
           additional_field_for_subclass2 = db.Column(...
           pass
      
    2. 所有表的公用表 - 如果您确信所有表的架构都将保持不变。我建议您为所有数据创建一个表,并使用一个附加字段 data_source 来指示行/数据的来源。

      class CommonTable(db.Model):
         data_source = db.Column(String(100) ..)
         field1 = ...
         field2 = ...
      

    【讨论】:

    • 我仍然对这些类的作用有些困惑。这里隐藏了很多魔法。最重要的是,我不确定如何在启动时操作我的表(例如,创建新表,丢弃旧表),而不是定义可能代表表的类。
    • 每个子类代表一个文件/表。您必须从 file-1 中读取一行并创建 Subclass1() 的对象。然后你可以使用 session.add() 和 session.commit 将这个对象持久化到数据库中。
    猜你喜欢
    • 2014-10-03
    • 2020-05-10
    • 2017-09-29
    • 2018-07-07
    • 2022-11-30
    • 1970-01-01
    • 2017-10-04
    • 2017-07-04
    • 2019-04-06
    相关资源
    最近更新 更多