1.解决的问题
数据可能重多次插入,要求当一条数数据多次插入时,重复的数据做更新操作。
2.解决问题的思路
建表的时候设置主键索引
根据一行的数据生成一个加密后的值,将该值设置为主键列。
3.具体实现
1.建表语句
CREATE TABLE Model
(
[ID] [nvarchar](255) NOT NULL PRIMARY KEY,
[Import_Time] [nvarchar](255) NOT NULL,
[Sales_Organization] [nvarchar](255) NULL,
[Week] [nvarchar](255) NULL,
[Channel] [nvarchar](255) NULL,
[Channel_Code] [nvarchar](255) NULL,
[EAN] [nvarchar](255) NULL,
[Model] [nvarchar](255) NULL,
[Brand] [nvarchar](255) NULL,
[Description] [nvarchar](255) NULL,
[Date] [nvarchar](255) NULL,
[Stock] [nvarchar](255) NULL,
[Sellout] [nvarchar](255) NULL,
[TCL_Code] [nvarchar](255) NULL,
[Product_Code] [nvarchar](255) NULL,
[org_id] [nvarchar](255) NULL,
[Year] [nvarchar](255) NULL,
[Store_Code] [nvarchar](255) NULL,
[Store_Name] [nvarchar](255) NULL,
[Category] [nvarchar](255) NULL,
[Customer_Group] [nvarchar](255) NULL,
[City] [nvarchar](255) NULL
);
2.加密函数
# 加密函数
def encryption(str):
import hashlib
m = hashlib.md5(str.encode("utf-8"))
encrypted_data = m.hexdigest()
return encrypted_data
3.根据一行数据生成主键列
# 读取csv中的数据
tb = pd.read_csv(file_name, delimiter=",", header=0)
# 对拼接后的一列数据中的每行调用 加密函数
tb['ID'] = (tb['Import_Time'].map(str) + tb['Week'].map(str) + tb['Channel'].map(str) + tb['Channel_Code'].map(str) + tb['EAN'].map(str) + tb['Model'].map(str) + tb['Description'].map(str) + tb['Date'].map(str) + tb['Stock'].map(str) + tb['Sellout'].map(str) + tb['TCL_Code'].map(str) + tb['Product_Code'].map(str) + tb['org_id'].map(str) + tb['Year'].map(str) + tb['Store_Code'].map(str) + tb['Store_Name'].map(str) + tb['Category'].map(str) + tb['Customer_Group'].map(str) + tb['City'].map(str)).map(encryption)
# 保存的表中
tb.to_sql(name=tbname, con=engine, chunksize=1000, if_exists='append', index=None)