背景
我正在寻找一种方法来转储使用Python和MySQL制作的MySQL查询的结果。 Peewee到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%,例如在一个数据库中的DOB之前的名称,而在另一个数据库中的之后的名称。
随意告诉我,我做错了或建议完全不同的做法,我全都耳朵。我非常擅长Python和Peewee(实际上是ORM)。我可以切换回Perl并通过DBI进行数据库查询,几乎没有麻烦。但是,它的excel库会给我带来很多问题,我想把它作为扩展我知识的时间。
答案 0 :(得分:5)
您可以使用模型元素上的方法:
for field in User._meta.get_sorted_fields():
print field.name
这将在模型上以顺序打印字段名称。