【问题标题】:Check whether the data exists in MYSQL data base using SQLAlchemy使用 SQLAlchemy 检查数据是否存在于 MYSQL 数据库中
【发布时间】:2017-05-11 02:27:03
【问题描述】:

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

IntegrityError: (mysql.connector.errors.IntegrityError) 1062 (23000): 键“P​​RIMARY”的重复条目“AAPL”

这是由于条目是重复的。我现在如何检查我要写入数据库的数据是否已经存在并处理它是否存在? csv文件头是这样的

ticker isin product_name currency market_data_source trading_location country部门

里面的数据是这样的:

AAPL IE00B4BNMY34 Accenture plc USD Yahoo NYSE USA 计算机硬件

还有这样的代码:

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)

【问题讨论】:

  • 您是否考虑过使用 SQL Merge 语句而不是 Insert 语句?这将避免必须将所有现有密钥从数据库中提取到 Python 程序中并进行检查。如果存在新数据,它还允许您更新行。
  • @CJC,你有例子吗?
  • @CJC 在 mysql 中没有 MERGE
  • 只使用 LOAD DATA INFILE。
  • @e4c5,你有一个例子,当相同的数据已经存在并且 csv 文件中的值得到更新时它应该如何工作?

标签: python mysql csv sqlalchemy


【解决方案1】:

使用LOAD DATA LOCAL INFILE解决了它

【讨论】:

    猜你喜欢
    • 2017-03-31
    • 2013-12-31
    • 2014-07-27
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 2022-11-26
    相关资源
    最近更新 更多