ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2019-06-20 16:42:34  阅读:275  来源: 互联网

标签:python openpyxl 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有