python - LOAD DATA LOCAL INFILE批量导入数据到mysql
最近正好要学习TPC-DS, 需要用到批量导入数据。这里用到了mysql自带的LOAD DATA LOCAL INFILE来导入数据。
要用这个命令,必须在server端和client端设置
1.安装mysql,这里省略
2.用 mysql --local-infile=1 -u user1 -p 进入mysql命令行。这里 --local-infile=1 用来说明client连接可以用load data local infile.
3.依次执行以下mysql命令。这里 SET GLOBAL local_infile = 'ON'; 是在server端设置允许用load data local infile.
1 use huazhu 2 CREATE TABLE sites (name VARCHAR(255), url VARCHAR(255)) 3 delete from sites; 4 SHOW GLOBAL VARIABLES LIKE 'local_infile'; 5 SET GLOBAL local_infile = 'ON'; 6 select * from sites; 7 INSERT INTO sites (name, url) VALUES ("RUNOOB", "https://www.runoob.com");
4.创建sites.dat file以备后用。注意字段之间的分割符是|。
Google|https://www.google.com
Github|https://www.github.com
Taobao|https://www.taobao.com
stackoverflow|https://www.stackoverflow.com/
5.执行mysql命令,批量从sites.dat文件中导入数据到数据库中的sites表.此命令中也指明了字段之间的分隔符。
LOAD DATA LOCAL INFILE 'sites.dat' INTO TABLE sites FIELDS TERMINATED BY '|';
贴上亲测执行成功的代码
1 import pymysql
2 mydb = pymysql.connect("ip","user", "password", "dbname",3306,local_infile=1)
3 mydb.set_charset('utf8')
4
5 mycursor = mydb.cursor()
6 mycursor.execute("select table_name from information_schema.tables where table_schema='huazhu';")
7
8 myresult = mycursor.fetchall() # fetchall() 获取所有记录
9 for x in myresult:
10 file_name="D:/Cipher/huazhu20201130/data/dat/"+x[0]+".dat"
11 sql="LOAD DATA LOCAL INFILE '"+file_name+"' INTO TABLE "+x[0]+" FIELDS TERMINATED BY '|';"
12 print(sql)
13 mycursor.execute(sql)
14 mydb.commit() # 数据表内容有更新,必须使用到该语句
15 print(mycursor.rowcount, "记录插入成功。")
说明:
1. port 3306可以省略,当然缺省会去连接3306
2. 这里我写了绝对地址,我们可以考虑配置环境变量之后写相对地址。