Python生成SQL脚本造数据-重构

在Python中,对于多次用到的功能,代码需要不断的优化,采用可扩展和可维护的方式。增加代码的可用性

1.输入数据示例

student_id     
201901                 
201902

2.具体代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#! /usr/bin
# -*- coding: utf-8 -*-
import random


# 函数名一律小写,如有多个单词,用下划线隔开,私有函数在函数前加一个下划线_
def create_sql_command(filedir, inputfile, tablename, config_string):
""" 创建SQL执行命令脚本 -无返回值void functionn"""
    with open(inputfile, mode='r', encoding='utf-8') as fileobj:
        # 文件对象提供的 readlines 返回一个列表(list)变量
        stringlist = fileobj.readlines()
        # 列表[] 变为字符串,列表是可变的 join接收字符串列表并拼接每个元素,
        #  split将字符串拆成单词列表,list函数将字符串拆成单个字母的列表
        outputfile = "/".join([filedir, tablename+'.sql'])
        fsavefile = open(outputfile, mode='w', encoding='utf-8')
        fsavefile.write("------------------------------------------start---------------------------------- \n")
        fsavefile.write(config_string)
        # len() 方法返回列表元素个数- len() 方法返回对象(字符、列表、元组等)长度或项目个数
        K = len(stringlist)
        # 遍历-循环
        # enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)
        # 组合为一个索引序列,同时列出数据和数据下标,start -- 下标起始位置。
        for i, line in enumerate(stringlist, start=1):
            print(i)
            data = line.split("\t")
            student_id = "'" + data[0].strip() + "' as student_id" 
            # 随机值
            grade_code = "'" + str(random.randint(1, 9)) + "' as grade_code"
            # 递增值
            # grade_code = "'" + str(i) + "' as grade_code"
            # 数值型数据的类型
            class_id = " 2 as class_id"
            update_time = "'" + "2019-05-11 12:00:00" + "' as update_time"
            # 创建元组,字段顺序需要和插入放入表顺序一致 ,元组field_set(元素均为字符串)
            field_set = (student_id, grade_code, class_id, label_nm,update_time)
            # 元组field_set(元素均为字符串)转为字符串
            field = ",".join(field_set)
            line_sql = "select " + field + "\n"
            pure_line_sql = line_sql + " union all "
            if 0 < i & i < K-1:
                print(pure_line_sql)
                fsavefile.write(pure_line_sql)
                fsavefile.write("\n")
            elif i == K-1:
                print(line_sql)
                fsavefile.write(line_sql)
                fsavefile.write("\n")
fsavefile.write(") t1 \n")
fsavefile.write("------------------------------------------end----------------------------------\n")
fsavefile.close()

# __name__是内置变量


if __name__ == "__main__":
# 需要给出 输入的文件位置,文件名, 表名以及是否是分区表,和分区表的分区字段
file_dir = ''F:/PythonProject/Python/Data'
# 输入文件的名称
filename = 'TestData.txt'
input_file = "/".join([file_dir, filename])
print("输入文件名: " + input_file)
# 变量名尽量小写, 如有多个单词,用下划线隔开,常量采用全大写,如有多个单词,使用下划线隔开
table_name = ''base.example_type_d'
# 分区表 True  以及分区字段 如果不是分区表 则设置 partiton_flag= False
# (0,空字符串,空列表、空字典、空元组、None, False)
partiton_flag = True
partiton_string = " partition(partition_date = '20191007') \n"
# 条件表达式 - 先执行中间的if,如果返回True,就是左边,False是右边。
partiton = partiton_string if partiton_flag is True else " \n"
configString = 'insert into  table  ' + table_name + partiton + "select * from  ( \n"
# 无返回值函数会返回一个特殊值 None
create_sql_command(file_dir, input_file, table_name, configString)

3.说明

01.对于会在不同位置多次出现的变量,修改一处,其余部分也会修改,所以,尽量在一处变动,而后续的代码不影响其功能,相同的部分提取出来
 本次修改,对于字段只需要修改其定义和在元组中的顺序,把是否是分区的情况提取出来,修改的功能量变小了,有助于提高通用性。
02.关于Python的一些问题,会使用,也要理解背后的原理,能表述出来
 with方法打开处理文件帮我我们做了什么?
   常规的方法try,except,finally,with 实现了finally中f.close
   try..except..else没有捕获到异常,执行else语句
   try..except..finally不管是否捕获到异常,都执行finally语句
 r、r+、rb、rb+文件打开模式区别
03.随机数
  random.randint(a,b),生成区间内的整数
04.  r  表示需要原始字符串,不转义特殊字符
     引号 否能不带转义显示单、双引号,以及多行的情况 单引号,双引号,三引号以及r

blogroll

social