4EWQE 发表于 2017-11-7 09:15:51

使用python+txt构建测试数据

一、背景
    有4张表,每张表要插入多条测试数据。如若还有同种需求,于是写了一个脚本,来添加数据。


二、代码

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
#--coding:utf8--
import pymysql


class InsertTestData(object):
    STUDENT_FILE = 'Student.txt'
    COURSE_FILE = 'Course.txt'
    TEACHER_FILE = 'Teacher.txt'
    SCORE_FILE = 'Score.txt'

    def __init__(self):
      self.connect = pymysql.Connect(
            host = 'localhost',
            port = 3306,
            user = 'root',
            # passwd = ' ',
            charset = 'utf8'
      )
      self.database = 'execersise_test'

    def read_lines(self, filename):
      dict = {}
      file_name = filename.split('.')
      dict['file_name'] = file_name
      with open(filename) as f:
            lines = f.readlines()
      dict['file_content'] = lines
      return dict

    def connect_mysql(self):
      cursor = self.connect.cursor()
      return cursor

    def close_mysql(self):
      self.connect.close()

    def close_curser(self):
      self.connect_mysql().close()

    def add_test_datas(self, file_obj):
      file = file_obj
      file_name = file['file_name']
      title = file['file_content'].strip()
      datas = file['file_content']
      content_len = len(datas)
      data = ''
      counter = 1
      for tmpdata in datas:
            if counter == content_len:
                data += '(' + tmpdata.strip() + ');'
            else:
                data += '(' + tmpdata.strip() + '),'
            counter += 1
      sql = 'insert into ' + self.database + '.' + file_name + ' (' + title + ') values '+ data
      try:
            # self.connect_mysql().executemany(sql)
            self.connect_mysql().execute(sql)
      except Exception as e:
            print('add_' + file_name + ' error: ', e)
      self.connect.commit()
      self.close_curser()

if __name__ == '__main__':
    testdata = InsertTestData()
    testdata.add_test_datas(testdata.read_lines(InsertTestData.STUDENT_FILE))
    testdata.add_test_datas(testdata.read_lines(InsertTestData.TEACHER_FILE))
    testdata.add_test_datas(testdata.read_lines(InsertTestData.COURSE_FILE))
    testdata.add_test_datas(testdata.read_lines(InsertTestData.SCORE_FILE))




    在main函数中,只需要指定要读取的文件,即可快速插入测试数据。

    为了便于构造sql语句,定义的数据文件格式如下:


1
2
3
4
5
6
7
8
9
10
11
12
13
`SID`,`CID`,`Degree`
'103' , '3-245' , '86'
'105' , '3-245' , '75'
'109' , '3-245' , '68'
'103' , '3-105' , '92'
'105' , '3-105' , '88'
'109' , '3-105' , '76'
'101' , '3-105' , '64'
'107' , '3-105' , '91'
'108' , '3-105' , '78'
'101' , '6-166' , '85'
'107' , '6-166' , '79'
'108' , '6-166' , '81'





三、遇到的问题

[*]UnicodeDecodeError: 'gbk' codec can't decode byte 0xbf in position 2: illegal multibyte sequence
原因:文件编码不是ANSI;
解决方法:将文件用notepad打开,另存,编码设置为ANSI格式。

[*]入库的中文信息乱码,显示为'?'
原因:在创建数据库时,未将charset设置为utf8;
解决方法:重建数据库,重建表,数据库和表的charset都设置为utf8

[*]如何将sql的values数据构造成‘(),(),();‘的格式
解决方法:增加计数器,当读取到最后一行时,以‘;’结尾

[*]如何通过读取一个文件,同时获取要操作的表名称、列名、values
解决方法:
数据文件的文件名称,定义成表名;
数据文件的titile,即第一行内容,定义成表的列;
数据文件的内容,即第一行之后的内容,定义成表的数据。


页: [1]
查看完整版本: 使用python+txt构建测试数据