Проверка дублирования при заполнении таблицы SQL с использованием SQLAlchemy / Pandas to_SQL - PullRequest
0 голосов
/ 17 января 2020

Я хотел бы сбросить данные в мою базу данных mysql. Если я хочу добавить дополнительные данные, я использую тот же файл cvs, как показано ниже, но дополненный дополнительной строкой.

Если я перезапущу свой код, данные просто снова включаются, плюс дополнительная строка. Это означает, что мои данные удваиваются плюс один.

Как я могу проверить базу данных и исключить двойные числа, чтобы включить только самую новую строку?

Исходный файл CSV выглядит следующим образом:

Ticker;Name;Country
A;Pablo;USA
B;Nico;USA
C;Dimi;USA
D;George;USA
E;Will;USA
F;Paul;USA

Расширенный файл CSV:

Ticker;Name;Country
A;Pablo;USA
B;Nico;USA
C;Dimi;USA
D;George;USA
E;Will;USA
F;Paul;USA
G;Tom;Russia

Код выглядит следующим образом:

import sqlalchemy as sqlal
import pandas as pd

mysql_engine = sqlal.create_engine('mysql+mysqlconnector://xxx/Test_Schema',poolclass=sqlal.pool.NullPool)

mysql_engine.raw_connection()

if not mysql_engine.dialect.has_table(mysql_engine, 'master_data'):  
    metadata = sqlal.MetaData(mysql_engine)

    sqlal.Table('master_data', metadata,
                sqlal.Column('Ticker', sqlal.String(20), nullable=False, primary_key=True),
                sqlal.Column('Name', sqlal.String(250), nullable=True),
                sqlal.Column('Country', sqlal.String(10), nullable=True)
    )
    metadata.create_all(mysql_engine)  

df_csv = pd.read_csv('TestFile.csv', encoding='cp1252', sep=';', index_col=0).dropna()
print(df_csv)
df_csv.to_sql(name='master_data', con=mysql_engine, if_exists = 'append', chunksize=900, index=True)

1 Ответ

0 голосов
/ 17 января 2020

Я решил это таким образом, но, может быть, есть что-то приятнее?

import sqlalchemy as sqlal
import pandas as pd

mysql_engine = sqlal.create_engine('mysql+mysqlconnector://xxx/Test_Schema',poolclass=sqlal.pool.NullPool)

mysql_engine.raw_connection()

if not mysql_engine.dialect.has_table(mysql_engine, 'master_data'):  
    metadata = sqlal.MetaData(mysql_engine)

    sqlal.Table('master_data', metadata,
                sqlal.Column('Ticker', sqlal.String(20), nullable=False, primary_key=True),
                sqlal.Column('Name', sqlal.String(250), nullable=True),
                sqlal.Column('Country', sqlal.String(10), nullable=True)
    )
    metadata.create_all(mysql_engine)  

df_csv = pd.read_csv('TestFile.csv', encoding='cp1252', sep=';', index_col=0).dropna()

for i in range(len(df_csv)):
    try:
        df_csv.iloc[i:i+1].to_sql(name='master_data',if_exists='append',con = mysql_engine, chunksize=900, index=True)
    except sqlal.exc.IntegrityError as e:
        pass #or any other action
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...