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'
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
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)
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.
"""
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.