6

背景

我正在寻找一种将使用 Python 和 Peewee 进行的 MySQL 查询结果转储到 excel 文件的方法,包括数据库列标题。我希望导出的内容以与数据库中的列几乎相同的顺序排列。此外,我希望有一种方法可以跨多个可能具有略微不同字段的类似数据库工作。澄清一下,一个数据库可能有一个包含“User, PasswordHash, DOB, [...]”的用户表,而另一个数据库有“User, PasswordHash, Name, DOB, [...]”。

问题

我的主要问题是以有序的方式获取列标题。迄今为止的所有尝试都导致了无序的结果,并且所有这些都没有那么优雅。

其次,到目前为止,我的方法导致我(个人)讨厌维护的代码,我知道这是一个不好的迹象。

工作至今

目前,我已经使用 Peewee 的 pwiz.py 脚本为目标数据库中的每个预先存在的数据库表生成模型,然后输入所有主键和外键。关系已建立,一些简短的测试表明它们正确关联。

代码:我设法使用类似于以下内容的方式获取列标题:

    for i, column in enumerate(User._meta.get_field_names()):
        ws.cell(row=0,column=i).value = column

如前所述,这是无序的。此外,这样做会迫使我做一些类似的事情

    getattr(some_object, title)

相应地动态填充字段。

想法和可能的解决方案

  • 手动写出我想要的东西在数组中的顺序,并使用它来循环和填充数据。这样做的优点是非常严格/精细的控制。缺点是我需要为每个数据库指定这个。

  • 为所有可能遇到的字段创建(无论是手动还是通过方法)具有相关加权值的字段哈希,然后编写一个根据权重对“_meta.get_field_names()”进行排序的方法。这样做的缺点是列可能不是 100% 以正确的顺序排列,例如在一个 DB 中 Name 在 DOB 之前,而在另一个 DB 之后。

随时告诉我我做错了,或者提出完全不同的方法,我全都听好了。我对 Python 和 Peewee(实际上是一般的 ORM)非常陌生。我可以切换回 Perl 并通过 DBI 进行数据库查询,几乎没有任何麻烦。但是,它的 excel 库会给我带来很多问题,我想借此机会扩展我的知识。

4

1 回答 1

7

您可以使用模型元数据上的一种方法:

for field in User._meta.get_sorted_fields():
    print field.name

这将按照在模型上声明的顺序打印字段名称。

于 2012-12-14T19:26:30.747 回答