数据库
首页 > 数据库> > Python:使用Peewee转储数据库数据

Python:使用Peewee转储数据库数据

作者:互联网

背景

我正在寻找一种方法来转储使用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%,例如在一个DB中DOB之前的名称,而在另一个DB之后.

随意告诉我,我做错了或建议完全不同的做法,我全都耳朵.我非常擅长Python和Peewee(实际上是ORM).我可以切换回Perl并通过DBI进行数据库查询,几乎没有麻烦.但是,它的excel库会给我带来很多问题,我想把它作为扩展我知识的时间.

解决方法:

您可以使用模型元素上的方法:

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

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

标签:python,openpyxl,peewee
来源: https://codeday.me/bug/20190620/1246420.html