SQLAlchemy模模型定义执行时

0 投票
1 回答
679 浏览
提问于 2025-04-16 14:21

我正在用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. 还有其他的选择

最终,我想要的是把所有像电子表格一样的数据文件放到SQL中,形成像电子表格的表格,并利用Elixir/SQLAlchemy的功能来处理所有的元数据。

我读了很多SQLAlchemy的文档,但它们似乎都是为那种“你想写一个博客”类型的应用写的,或者至少是那些在写代码之前就完全确定数据结构的应用。我想我正在尝试写一个对列规格不敏感的模型。

1 个回答

3

我首先想到的是,elixir 对你解决问题的帮助不大。

我的建议是选择第二种方法,试着根据你已有的元数据来建立一个表格。你可以重新阅读一下架构文档,看看如何以编程的方式添加列,然后创建这个表格:

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

比如:

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)

然后你就可以开始往你新创建的表格里插入数据了。你还需要记录生成的表格和数据文件之间的对应关系。如果另一个数据文件的结构和你生成的表格匹配,你可以重复使用这个表格。

撰写回答