执行时的SQLAlchemy模型定义

时间:2011-03-24 20:12:53

标签: python sql sqlalchemy python-elixir

我正在使用Elixir和SQLAlchemy编写ORM来处理将类似电子表格的数据移动到SQL中。通常,类似电子表格的数据的内容是未知的,并且pyparsing从文本文件中解析关于类似电子表格的数据的数据

(例如:人口普查在固定平面文件中发布当前人口调查,并附有描述数据内容的txt文件,包括数据中每列的列规范和文档)

正如我所想象的那样,ORM看起来像这样

class DataSet(entity)
    """a collection of many spreadsheet-like files"""
class DataFile(entity)
    """describes a single spreadsheet-like file"""
class Variable(entity)
    """describes a single column in spreadsheet-like file"""

因此,这个模型描述了坐在硬盘上的一堆平面文件的内容。现在,如果我想将这些平面文件带到SQL,我应该

  1. 尝试将SQL编写为字符串并替换上面写的模型中的信息

  2. 尝试定义新的Elixir / SQLAlchemy实体

  3. 第三个选项

  4. 在一天结束时,我想我想要的是所有的电子表格,如SQL中的数据文件,类似电子表格的表格,以及用于处理所有元数据的Elixir / SQLAlchemy魔力< / p>

    我已经阅读了很多SQLAlchemy文档,但是它们都没有,但它们似乎都是为“你想编写一个博客”类型的应用程序编写的,或者至少是在完全识别出数据结构的应用程序之前编写的编写代码。我想我正在尝试编写一个与其列规格无关的模型。

1 个答案:

答案 0 :(得分:3)

我的第一个想法是,灵药不会对解决方案有什么好处。

我的建议是2),因为你试图根据你拥有的元数据建立一个表。 (重新)阅读模式文档以了解如何以编程方式添加列,然后创建表:

http://www.sqlalchemy.org/docs/core/schema.html

e.g。

sqla_metadata = sqlalchemy.schema.MetaData()

type_mapping = {'int': Integer, 'text': String} # etc.
cols = []
for (col_name, col_type) in your_parsed_metadata.fields:
    cols.append(Column(col_name, type_mapping[col_type]))

cols.append(Column('datafile_id', Integer, ForeignKey("datafile.datafile_id"), nullable=False),)
new_table = Table(your_parsed_metadata.tablename, sqla_metadata, *cols)
sqla_metadata.create_all(engine)

然后您可以开始插入新创建的表格。 您还需要跟踪生成的表数据文件之间的映射。 如果模式匹配,您可以将生成的表重用于另一个数据文件。