[PYTHON] Pièges et solutions de contournement pour pandas.DataFrame.to_sql

Bien qu'une table temporaire ait été créée sur la base de données en fonction des données de type de trame de données dans le lot Le 64e caractère et les suivants des données de la colonne de type d'objet ont disparu sans autorisation. Je n'ai reçu aucune erreur ou avertissement, mais ... je vais donc résumer le remède.


Supposons que vous souhaitiez créer une table dans DB basée sur les données suivantes (le nom est de 70 caractères)

sample.csv


name,age
AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDDDDDEEEEEEEEEEFFFFFFFFFFGGGGGGGGGG,20
AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDDDDDEEEEEEEEEEFFFFFFFFFFGGGGGGGGGG,18
AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDDDDDEEEEEEEEEEFFFFFFFFFFGGGGGGGGGG,23
AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDDDDDEEEEEEEEEEFFFFFFFFFFGGGGGGGGGG,21

Lors de l'utilisation de la fonction pandas to_sql et de mysql.connector

Source de l'échantillon

sample_to_sql.py


import pandas as pd
import mysql.connector
df = pd.read_csv('sample.csv')
table_name = "sample_to_sql"
db_settings = {
    "host": <nom d'hôte>,
    "database": <Nom de la base de données>,
    "user": <Nom d'utilisateur>,
    "password": <mot de passe>,
    "port":3306
}
con = mysql.connector.connect(**db_settings)
df.to_sql(table_name, con, flavor='mysql', index=False)

résultat

スクリーンショット 2016-04-25 17.32.13.png

C'est un peu déroutant, mais le 64e et les suivants caractères du nom ont disparu.

En regardant les informations de la table スクリーンショット 2016-04-25 17.33.39.png

La limite est de 63 caractères ... Les colonnes de type objet ont été codées en dur pour créer des tables avec varchar (63). (Autour de la ligne 1310 de ~~~ / site-packages / pandas / io / sql.py)

Solution

Lorsque j'exécute le script ci-dessus, j'obtiens cet avertissement dans la partie df.to_sql.

FutureWarning: The 'mysql' flavor with DBAPI connection is deprecated and will be removed in future versions. MySQL will be further supported with SQLAlchemy connectables.

Alors, installez sqlalchemy

sudo pip install sqlalchemy

Exemple de code

sample_sqlalchemy.py


import pandas as pd
from sqlalchemy import create_engine
df = pd.read_csv('sample.csv')
table_name = "sample_sqlalchemy"
db_settings = {
    "host": <nom d'hôte>,
    "database": <Nom de la base de données>,
    "user": <Nom d'utilisateur>,
    "password": <mot de passe>,
    "port":3306
}
engine = create_engine('mysql://{user}:{password}@{host}:{port}/{database}'.format(**db_settings))
df.to_sql(table_name, engine, flavor='mysql', index=False)

À ce stade, une table qui correspond au contenu du bloc de données est créée. En regardant le contenu, cela ressemble à ceci.

スクリーンショット 2016-04-25 17.07.00.png

Ce qui était varchar était du texte. Les données sont en place. スクリーンショット 2016-04-25 17.42.52.png

Recommended Posts

Pièges et solutions de contournement pour pandas.DataFrame.to_sql
(Windows) Causes et solutions de contournement pour UnicodeEncodeError dans Python 3
Pour moi: notes sur l'infrastructure et le réseau
(Pour moi) Flask_ex (modèles et statique)
Veuillez arrêter l'impression et importer la journalisation pour la sortie du journal
Conseils pour remplacer et déboguer les fonctions
Vectoriser les phrases et rechercher des phrases similaires
3 types de solutions de contournement pour activer le problème de collision lorsque pyenv et anaconda coexistent