it-swarm.com.de

Schreiben Sie in die MySQL-Datenbank mit Pandas mit SQLAlchemy, to_sql

versuch, Pandas-Datenrahmen mit to_sql in die MySQL-Tabelle zu schreiben. Früher wurde Flavor = 'mysql' verwendet, es wird jedoch in der Zukunft abgeschrieben und der Übergang zur Verwendung der SQLAlchemy-Engine wollte beginnen.

beispielcode:

import pandas as pd
import mysql.connector
from sqlalchemy import create_engine

engine = create_engine('mysql+mysqlconnector://[user]:[pass]@[Host]:[port]/[schema]', echo=False)
cnx = engine.raw_connection()
data = pd.read_sql('SELECT * FROM sample_table', cnx)
data.to_sql(name='sample_table2', con=cnx, if_exists = 'append', index=False)

Der Lesevorgang funktioniert gut, aber der to_sql hat einen Fehler:

DatabaseError: Ausführung fehlgeschlagen auf sql 'SELECT name FROM sqlite_master WHERE type =' table 'AND name = ?;': Falsche Anzahl von Argumenten während der String-Formatierung

Warum sieht es so aus, als würde es versuchen, sqlite zu verwenden? Was ist die korrekte Verwendung einer sqlalchemy-Verbindung mit mysql und speziell mysql.connector?

Ich habe auch versucht, die Engine als Verbindung weiterzuleiten, und das gab mir einen Fehler beim Verweisen auf kein Cursorobjekt.

data.to_sql(name='sample_table2', con=engine, if_exists = 'append', index=False)
>>AttributeError: 'Engine' object has no attribute 'cursor'
40
AsAP_Sherb

Die Verwendung der Engine anstelle von raw_connection () funktionierte:

import pandas as pd
import mysql.connector
from sqlalchemy import create_engine

engine = create_engine('mysql+mysqlconnector://[user]:[pass]@[Host]:[port]/[schema]', echo=False)
data.to_sql(name='sample_table2', con=engine, if_exists = 'append', index=False)

nicht klar, warum, als ich dies gestern ausprobierte, gab es den früheren Fehler

56
AsAP_Sherb

Alternativ können Sie das Paket pymysql verwenden ...

import pymysql
from sqlalchemy import create_engine
cnx = create_engine('mysql+pymysql://[user]:[pass]@[Host]:[port]/[schema]', echo=False)

data = pd.read_sql('SELECT * FROM sample_table', cnx)
data.to_sql(name='sample_table2', con=cnx, if_exists = 'append', index=False)
6
openwonk

Mit pymysql und sqlalchemy funktioniert dies für Pandas v0.22: 

import pandas as pd
import pymysql
from sqlalchemy import create_engine

user = 'yourUserName'
passw = 'password'
Host =  'hostName'  # either localhost or ip e.g. '172.17.0.2' or hostname address 
port = 3306 
database = 'dataBaseName'

mydb = create_engine('mysql+pymysql://' + user + ':' + passw + '@' + Host + ':' + str(port) + '/' + database , echo=False)

directory = r'directoryLocation'  # path of csv file
csvFileName = 'something.csv'

df = pd.read_csv(os.path.join(directory, csvFileName ))

df.to_sql(name=csvFileName[:-4], con=mydb, if_exists = 'replace', index=False)

"""
if_exists: {'fail', 'replace', 'append'}, default 'fail'
     fail: If table exists, do nothing.
     replace: If table exists, drop it, recreate it, and insert data.
     append: If table exists, insert data. Create if does not exist.
"""
3
DougR

Ich weiß, dass im Titel der Frage das Word SQLAlchemy enthalten ist, jedoch sehe ich in den Fragen und Antworten die Notwendigkeit, Pymysql oder mysql.connector zu importieren, und es ist auch möglich, den Job mit Pymysql auszuführen, ohne SQLAlchemy aufzurufen.

import pymysql
user = 'root'
passw = 'my-secret-pw-for-mysql-12ud' # In previous posts variable "pass"
Host =  '172.17.0.2'
port = 3306

database = 'sample_table' # In previous posts similar to "schema"

conn = pymysql.connect(Host=host,
                       port=port,
                       user=user, 
                       passwd=passw,  
                       db=database)

data.to_sql(name=database, con=conn, if_exists = 'append', index=False, flavor = 'mysql')

Ich denke, dass diese Lösung gut sein kann, obwohl SQLAlchemy nicht verwendet wird.

0
Rafael Valero