[PYTHON] Ich habe Pandas 'Sql Upsert ausprobiert

Einführung

Dies ist Miyano (@estie_mynfire) von estie CTO.

Da estie Immobiliendaten aus verschiedenen Ressourcen erstellt, werden Pandas zur Datenformung verwendet. aus diesem Grund ** Mit pandas-> DataBase erstellte Daten ** Es ist wichtig, den Fluss reibungslos durchzuführen.

Bisher gab es nur Ersetzen und Anhängen, daher musste ich auf der Pandaseite mein Bestes geben, um zu formen und dann zu aktualisieren. (Das ist sehr nervig)

In der Zwischenzeit hatten Pandas neulich die lang erwartete Pull-Anfrage zum Hinzufügen der SQL Upsert-Funktion, also habe ich versucht, sie zu verschieben. Dies sollte Ihre Arbeitseffizienz explodieren lassen ...! !!

image.png

Was ist Upsert überhaupt?

Es bedeutet Einfügen und Aktualisieren. Es gibt zwei Hauptfunktionen von Upsert in SQL.

  1. Basierend auf dem Primärschlüssel existiert nichts und Insert (** upsert_keep **) existiert nicht.
  2. Wenn vorhanden, aktualisieren Sie ihn basierend auf dem Primärschlüssel. Wenn er nicht vorhanden ist, fügen Sie ihn ein (** upsert_overwrite **).

Warum bist du froh, es mit Pandas machen zu können?

Daher möchten Python-Ingenieure Tabellen mit Vertrauen ** direkt von Pandas aktualisieren.

Fazit

'''
Attributes:
    df (pd.DataFrame): any DataFrame
    tablename (str):Tabellenname
'''
import pandas as pd
from sqlalchemy import create_engine

con = create_engine('mysql+mysqlconnector://[user]:[pass]@[host]:[port]/[schema]')

# upsert_keep ->Grundsätzlich nichts tun(?)Es besteht die Möglichkeit eines Fehlers, daher werde ich ihn mir in Zukunft ansehen.
df.to_sql(tablename, con, if_exist='upsert_keep', index=False)

# upsert_overwrite ->Aktualisieren Sie die vorhandenen und fügen Sie sie ein, wenn sie nicht vorhanden sind. Wie beabsichtigt
df.to_sql(tablename, con, if_exist='upsert_overwrite', index=False)

Env Von hier aus werde ich eine konkrete Geschichte schreiben. Die Umgebung ist wie folgt.

Setting

Umgebung

git clone https://github.com/V0RT3X4/pandas.git
cd pandas
git checkout -b sql-upsert
git pull origin  sql-upsert

git rev-parse HEAD #Aktueller Commit-Hash-Wert
# d0eb251075883902280cba6cd0dd9a1a1c4a69a4

Installation from sources

pip install cython
# Successfully installed cython-0.29.14
python setup.py build_ext --inplace --force #Es benötigt viel Zeit. Warten wir geduldig.

Mysql server

Richten Sie für lokale Tests einen MySQL-Server ein und erstellen Sie eine Benutzertabelle.

Benutzertabelle (** ID-Spalte ist der Primärschlüssel **)

id name age
0 taro 20
1 jiro 17
2 saburo 18

mysql.server start --skip-grant-tables #Starten Sie einen MySQL-Server, auf dem Sie sich ohne Kennwort anmelden können
mysql #Einloggen

mysql> CREATE DATABASE testdb;
mysql> USE testdb;
mysql> CREATE TABLE users (
         id INT NOT NULL,
         name VARCHAR(256),
         age INT
       );
mysql> ALTER TABLE users ADD PRIMARY KEY (id);
mysql> INSERT INTO users (id, name, age) VALUES
       (0, 'taro', 20),
       (1, 'jiro', 19),
       (2, 'saburo', 18);

Hauptthema

Von hier aus werde ich SQL Upsert mit Pandas und SQLalchemie ausprobieren.

Db connect Zunächst aus der Verbindung mit der DB. sqlalchemy ist erforderlich. Wenn Sie es nicht haben, führen Sie bitte pip install sqlalchemy durch

from sqlalchemy import create_engine
import pandas as pd

con = create_engine('mysql+mysqlconnector://@localhost/testdb')
# format: 'mysql+mysqlconnector://[user]:[pass]@[host]:[port]/[schema]'
users = pd.read_sql('SELECT * FROM users;', con)
users
#   id    name  age
#0   0    taro   20
#1   1    jiro   19
#2   2  saburo   18

Upsert

Schreiben Sie zuerst den DataFrame neu

users.loc[users.id==0, 'name'] = 'syo'
users = pd.concat([users, pd.DataFrame({'id': [3], 'name': ['shiro'], 'age': [28]})])
#   id    name  age
#0   0     syo   20
#1   1    jiro   19
#2   2  saburo   18
#0   3   shiro   28

Die grundlegende Syntax der to_sql-Methode lautet

df.to_sql(tablename, con, if_exist, index=False)
# df: pd.DataFrame
# tablename:Tabellenname

# if_exist: {'fail', 'replace', 'append', 'upsert_overwrite', 'upsert_keep'}

# * fail: Raise a ValueError. 
# * replace: Drop the table before inserting new values. 
# * append: Insert new values to the existing table. 
# * upsert_overwrite: Overwrite matches in database with incoming data. 
# * upsert_keep: Keep matches in database instead of incoming data.

(Weitere Argumente finden Sie unter pandas / core / generic.py!)

upsert_keep

users.to_sql('users', con, if_exists='upsert_keep', index=False)
pd.read_sql('SELECT * FROM users;', con) #Bestätigung
#   id    name  age
#0   0     taro   20
#1   1    jiro   19
#2   2  saburo   18

upsert_overwrite

users.to_sql('users', con, if_exists='upsert_overwrite', index=False)
pd.read_sql('SELECT * FROM users;', con) #Bestätigung
#   id    name  age
#0   0     syo   20
#1   1    jiro   19
#2   2  saburo   18
#3   3   shiro   28

abschließend

Probleme mit upsert_keep verhalten sich nicht wie beabsichtigt

Es scheint notwendig, sich um die _upsert_keep_processing-Methode von [pandas / io / sql.py] zu kümmern (https://github.com/V0RT3X4/pandas/blob/d0eb251075883902280cba6cd0dd9a1a1c4a69a4/pandas/io/sql). Sobald die Ursache bekannt ist, werden wir die Pull-Anfrage und den Artikel aktualisieren.

Über estie

Bei estie sind wir immer auf der Suche nach Ingenieuren, die von neuen Technologien und Full-Stack-Ingenieuren begeistert sind! https://www.wantedly.com/companies/company_6314859/projects

estie -> https://www.estie.jp estiepro -> https://pro.estie.jp Unternehmensseite-> https://www.estie.co.jp

Recommended Posts

Ich habe Pandas 'Sql Upsert ausprobiert
Ich habe PyQ ausprobiert
Ich habe AutoKeras ausprobiert
Ich habe es mit Papiermühle versucht
Ich habe versucht, Django-Slack
Ich habe es mit Django versucht
Ich habe es mit Spleeter versucht
Ich habe es mit cgo versucht
Ich habe die Pivot-Table-Funktion von Pandas ausprobiert
Ich habe versucht, Argparse zu verwenden
Ich habe versucht, anytree zu verwenden
Ich habe versucht, aiomysql zu verwenden
Ich habe versucht, Summpy zu verwenden
Ich habe versucht, Coturn zu verwenden
Ich habe versucht, "Anvil" zu verwenden.
Ich habe versucht, Hubot zu verwenden
Ich habe versucht, ESPCN zu verwenden
Ich habe PyCaret2.0 (pycaret-nightly) ausprobiert.
Ich habe versucht, tief zu lernen
Ich habe AWS CDK ausprobiert!
Ich habe versucht zu debuggen.
Ich habe versucht, PyCaret zu verwenden
Ich habe versucht, Cron zu verwenden
Ich habe Kivys Kartenansicht ausprobiert
Ich habe versucht, ngrok zu verwenden
Ich habe versucht, face_recognition zu verwenden
Ich habe versucht, Jupyter zu verwenden
Ich habe versucht, EfficientDet zu verschieben
Ich habe versucht, Shell zu programmieren
Ich habe versucht, doctest zu verwenden
Ich habe Python> Decorator ausprobiert
Ich habe versucht, TensorFlow auszuführen
Ich habe Auto Gluon ausprobiert
Ich habe versucht, Folium zu verwenden
Ich habe versucht, jinja2 zu verwenden
Ich habe AWS Iot ausprobiert
Ich habe die Bayes'sche Optimierung ausprobiert!
Ich habe versucht, Folium zu verwenden
Ich habe versucht, das Zeitfenster zu verwenden
Ich habe versucht zusammenzufassen, wie man Pandas von Python benutzt
Ich habe Value Iteration Networks ausprobiert
Ich habe fp-Wachstum mit Python versucht
Ich habe versucht, mit Python zu kratzen
Ich habe die Bildklassifizierung von AutoGluon ausprobiert
Ich habe versucht, mit Elasticsearch Ranking zu lernen!
[Ich habe versucht, Pythonista 3 zu verwenden] Einführung
Ich habe versucht, easydict (Memo) zu verwenden.
Ich habe versucht, SVM zu organisieren.
Ich habe versucht, das Gesicht mit Face ++ zu erkennen
Ich habe versucht, RandomForest zu verwenden
Ich habe versucht, mit PyCaret zu clustern
Ich habe versucht, BigQuery ML zu verwenden
Ich habe "K-Fold Target Encoding" ausprobiert.
Ich habe versucht, PCANet zu implementieren
Ich habe versucht, Amazon Glacier zu verwenden
Ich habe versucht, den in Pandas häufig verwendeten Code zusammenzufassen