您好,登錄后才能下訂單哦!
一、背景
有4張表,每張表要插入多條測(cè)試數(shù)據(jù)。如若還有同種需求,于是寫(xiě)了一個(gè)腳本,來(lái)添加數(shù)據(jù)。
二、代碼
#--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函數(shù)中,只需要指定要讀取的文件,即可快速插入測(cè)試數(shù)據(jù)。
為了便于構(gòu)造sql語(yǔ)句,定義的數(shù)據(jù)文件格式如下:
`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'
三、遇到的問(wèn)題
UnicodeDecodeError: 'gbk' codec can't decode byte 0xbf in position 2: illegal multibyte sequence
原因:文件編碼不是ANSI;
解決方法:將文件用notepad打開(kāi),另存,編碼設(shè)置為ANSI格式。
入庫(kù)的中文信息亂碼,顯示為'?'
原因:在創(chuàng)建數(shù)據(jù)庫(kù)時(shí),未將charset設(shè)置為utf8;
解決方法:重建數(shù)據(jù)庫(kù),重建表,數(shù)據(jù)庫(kù)和表的charset都設(shè)置為utf8
如何將sql的values數(shù)據(jù)構(gòu)造成‘(),(),();‘的格式
解決方法:增加計(jì)數(shù)器,當(dāng)讀取到最后一行時(shí),以‘;’結(jié)尾
如何通過(guò)讀取一個(gè)文件,同時(shí)獲取要操作的表名稱、列名、values
解決方法:
數(shù)據(jù)文件的文件名稱,定義成表名;
數(shù)據(jù)文件的titile,即第一行內(nèi)容,定義成表的列;
數(shù)據(jù)文件的內(nèi)容,即第一行之后的內(nèi)容,定義成表的數(shù)據(jù)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。