# Python

# Python使用tablib生成excel文件示例

首先要安装tablib模块,在命令行输入:pip intall tablib

import tablib
headers = ('lie1', 'lie2', 'lie3', 'lie4', 'lie5')
mylist = [('23','23','34','23','34'),('sadf','23','sdf','23','fsad')]
mylist = tablib.Dataset(*mylist, headers=headers)
with open('excel.xlsx', 'wb') as f:
    f.write(mylist.xlsx)

# 查询python安装了哪些模块

pydoc modules
>>> import sys
>>> sys.modules.keys()

# 阿里巴巴开源ETL工具DataX配置及使用

因公司内部业务系统使用的数据库不一样,需要做一些数据报表在一个系统中,通过datax可以拉取不同数据库的数据到数据仓库中

  1. 环境要求
  • JDK1.6以上版本,推荐1.6
  • python 2.x版本,推荐2.6.6
  1. 直接下载打包好的 DataX (opens new window) 1 (opens new window): https://github.com/alibaba/DataX

  2. 通过ssh工具上传到linux服务器

rz  datax.tar.gz 
  1. 解压程序包
tar -zxvf datax.tar.gz 
  1. 进入bin目录,生成读mysql写Oracle的json配置文件
python datax.py -r mysqlreader -w oraclewriter
  1. 修改配置文件
{
        "content":[
                {
                        "reader":{
                                "name":"mysqlreader",
                                "parameter":{
                                        "column":[
                                                "EMPNAME",
                                                "CUSTFLAG",
                                                "RMB"
                                        ],
                                        "connection":[
                                                {
                                                        "jdbcUrl":[
                                                                "jdbc:mysql://10.12.1.27:3306/rss4product"
                                                        ],
                                                        "table":[
                                                                "RSS_CRM_RMB"
                                                        ]
                                                }
                                        ],
                                        "password":"*********",
                                        "username":"root",
                                        "where":""
                                }
                        },
                        "writer":{
                                "name":"oraclewriter",
                                "parameter":{
                                        "column":[
                                                "EMPNALE",
                                                "CUSTFLAG",
                                                "RMB"
                                        ],
                                        "connection":[
                                                {
                                                        "jdbcUrl":"jdbc:oracle:thin:@172.16.2.33:1521:ORCL",
                                                        "table":[
                                                                "RSS_CRM_RMB"
                                                        ]
                                                }
                                        ],
                                        "password":"*************",
                                        "preSql":[
                                                "delete from RSS_CRM_RMB"
                                        ],
                                        "username":"COREMAILCRM"
                                }
                        }
                }
        ],
        "setting":{
                "speed":{
                        "channel":1
                }
        }
}
  1. 传输数据
    python datax.py ../task/rss2crm_rmb.json 
  1. 配置crontab 定制拉数据

# Django 从已有的数据库实体反向创建model

Django ORM 的 migrate 命令可以让开发人员不用接触数据库脚本,用代码构建一个项目,并且Django支持自动跟踪model class的变动。 但比如我现在一个项目,需要把客户的一个系统中的工资数据查询出来,已经有现有的数据库表结构,就需要从数据库实体表来反向生成Django 的models中的class。

# 查询数据库表结构

mysql> desc bak_its_hr20191029;
+--------------+--------------+------+-----+---------+-------+
| Field        | Type         | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+-------+
| FId          | bigint(20)   | NO   |     | 0       |       |
| FClockTime   | datetime     | YES  |     | NULL    |       |
| FEmail       | varchar(255) | YES  |     | NULL    |       |
| FExternalId  | varchar(36)  | YES  |     | NULL    |       |
| FGps         | varchar(255) | YES  |     | NULL    |       |
| FMacAddr     | varchar(255) | YES  |     | NULL    |       |
| FSyncMessage | varchar(255) | YES  |     | NULL    |       |
| FSyncTime    | datetime     | YES  |     | NULL    |       |
+--------------+--------------+------+-----+---------+-------+

# 反向生成modes.py

inspectdb 命令可以查找settings.py中配置的数据库中的表来生成modes.py,如果有多个可以加 --database参数指定数据库,为空默认为defaule数据库,命名后可指定表名,多个表名以逗号分隔.

    py .\manage.py inspectdb bak_its_hr20191029

确认内容无误后,再执行

    py .\manage.py inspectdb bak_its_hr20191029  > .\chrtest\models.py

特别注意,生成的class中有个 managed = false 属性,这意味着Django不会表该表进行更新。如果这个属性为true, 则modes中的变化会同步更新到数据库

# 获取列表最小值或最大值

chwlist = [3, 9, 7, 7, 1, 4]
# 获得列表最大值索引
print(chwlist.index(max(chwlist)))    
# 1
# 获得列表最小值索引
print(chwlist.index(min(chwlist)))
# 4

# 获得字典最大值或最小值的key

chwdire = {'key55':55, 'key44':44, 'key99':99, 'key22':22}
print(max(chwdire, key=chwdire.get))  # 获得字典最大值的key
# key99
print(min(chwdire, key=chwdire.get))
# key22

# 查找过滤列表中的数据

chwlist = [{"id": 101, "timestamp": 11594},
         {"id": 102, "timestamp": 19346},
         {"id": 103, "timestamp": 95412},
         {"id": 104, "timestamp": 84694}]

# 筛选id等于103而且timestamp大于等于10000的元素 
chsres0 = [x for index, x in enumerate(chwlist) if 
        {k: v for k, v in x.items() if (k == "timestamp" and v == 10000)}
        and
        {k: v for k, v in x.items() if (k == "id" and v == 103)}
        ]
print(chsres0)