使用python+txt构建测试数据

发布时间:2019-06-27 09:53:57编辑:auto阅读(1263)

    一、背景

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


    二、代码

    #--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('.')[0]
            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'][0].strip()
            datas = file['file_content'][1:]
            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语句,定义的数据文件格式如下:

    `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'


    三、遇到的问题

    1. UnicodeDecodeError: 'gbk' codec can't decode byte 0xbf in position 2: illegal multibyte sequence

      原因:文件编码不是ANSI;

      解决方法:将文件用notepad打开,另存,编码设置为ANSI格式。

    2. 入库的中文信息乱码,显示为'?'

      原因:在创建数据库时,未将charset设置为utf8;

      解决方法:重建数据库,重建表,数据库和表的charset都设置为utf8

    3. 如何将sql的values数据构造成‘(),(),();‘的格式

      解决方法:增加计数器,当读取到最后一行时,以‘;’结尾

    4. 如何通过读取一个文件,同时获取要操作的表名称、列名、values

      解决方法:

      数据文件的文件名称,定义成表名;

      数据文件的titile,即第一行内容,定义成表的列;

      数据文件的内容,即第一行之后的内容,定义成表的数据。

关键字