使用SQLAlchemy检查MYSQL数据库中是否存在数据

时间:2016-12-26 17:23:31

标签: python mysql csv sqlalchemy

我想从csv文件中写入数据。一切正常。如果我再次运行我的脚本,我会收到一条错误消息:

  

IntegrityError:(mysql.connector.errors.IntegrityError)1062(23000):   键'PRIMARY'重复输入'AAPL'

这是因为条目是重复的。我现在如何检查我想写入数据库的数据是否已经存在并处理它是否存在? csv文件头看起来像这样

  

ticker isin product_name currency market_data_source trading_location country sector

和里面的数据如下:

  

AAPL IE00B4BNMY34埃森哲plc美元雅虎纽约证券交易所美国计算机硬件

这样的代码:

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)

1 个答案:

答案 0 :(得分:0)

使用LOAD DATA LOCAL INFILE

解决了这个问题