私は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)
持っを使用して、それを解決しましたInsertの代わりにSQL Mergeステートメントを使用することを検討しましたか?これにより、既存のすべてのキーをデータベースからPythonプログラムに引き出してチェックする必要がなくなります。また、新しいデータがある場合に行を更新することもできます。 – CJC
@CJC、あなたには例がありますか? – MCM
@CJC MySQLのMERGEは – e4c5