2016-12-26 221 views
0

我想從csv文件寫入數據。一切正常。如果我再次運行我的腳本,我收到一條錯誤消息:使用SQLAlchemy檢查數據是否存在於MYSQL數據庫中

IntegrityError: (mysql.connector.errors.IntegrityError) 1062 (23000): Duplicate entry 'AAPL' for key 'PRIMARY'

這是因爲條目是重複的。我現在該如何檢查我想要寫入數據庫的數據是否已經存在並處理它存在? CSV文件頭看起來像這樣

ticker isin product_name currency market_data_source trading_location country sector

和內像這樣的數據:

AAPL IE00B4BNMY34 Accenture plc USD Yahoo NYSE USA Computer Hardware

而且這樣的代碼:

import sqlalchemy as sqlal 
import pandas as pd 

#csv loader 
csv_loader = pd.read_csv('C:/Test.csv', encoding='cp1252', sep=';', index_col=0).dropna() 

#connection to mysql database 
mysql_engine = sqlal.create_engine('mysql+mysqlconnector://xxx/financialanalysis') 
mysql_engine.raw_connection() 

metadata = sqlal.MetaData() 

#------------------------------ 
#create table in mysql database 
#------------------------------ 
product = sqlal.Table('product', metadata, 
         sqlal.Column('ticker', sqlal.String(10), primary_key=True, nullable=False, unique=True),     
         sqlal.Column('isin', sqlal.String(12), nullable=True), 
         sqlal.Column('product_name', sqlal.String(80), nullable=True), 
         sqlal.Column('currency', sqlal.String(3), nullable=True), 
         sqlal.Column('market_data_source', sqlal.String(20), nullable=True), 
         sqlal.Column('trading_location', sqlal.String(20), nullable=True), 
         sqlal.Column('country', sqlal.String(20), nullable=True), 
         sqlal.Column('sector', sqlal.String(80), nullable=True), 
         ) 

metadata.create_all(mysql_engine) 

#Write the data into the mysql database 
csv_loader = csv_loader.reset_index() 
insert_product_data = product.insert().values(csv_loader.to_dict('records')) 
mysql_engine.execute(insert_product_data) 
+0

有無您考慮使用SQL合併語句而不是插入?這將避免必須將數據庫中的所有現有密鑰拉入Python程序並檢查它們。它還將允許您在出現新數據的情況下更新行。 – CJC

+0

@CJC,你有沒有例子? – MCM

+0

@CJC沒有MERGE在mysql – e4c5

回答

0

解決它通過使用LOAD DATA LOCAL INFILE

相關問題