itsource

SQL Chemy, to_sql을 사용하여 팬더와 MySQL 데이터베이스에 쓰기

mycopycode 2022. 9. 27. 23:54
반응형

SQL Chemy, to_sql을 사용하여 팬더와 MySQL 데이터베이스에 쓰기

팬더 데이터 프레임을 MySQL 테이블에 쓰려고 합니다.to_sql·기존에 사용flavor='mysql'단, 향후 감가상각될 예정이므로 SQL Chemy 엔진을 사용하는 것으로의 전환을 희망하고 있습니다.

샘플 코드:

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)

판독은 정상적으로 동작하지만to_sql에러가 발생했습니다.

데이터베이스 오류:sql 'SELECT name FROM sqlite_master WHERE type='table' AND name=에서 실행하지 못했습니다.;': 문자열 형식 지정 중 인수 수가 잘못되었습니다.

sqlite를 사용하려고 하는 것처럼 보이는 이유는 무엇입니까?mysql, 특히 mysql.connector와 sqlalchemy 연결을 올바르게 사용하는 방법은 무엇입니까?

또, 접속으로서 엔진을 건네려고 했는데, 커서 오브젝트가 없는 것을 나타내는 에러가 발생했습니다.

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

대신 엔진 사용raw_connection()동작:

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)

내가 어제 이것을 시도했을 때 왜 그것이 나에게 이전의 오류를 주었는지 명확하지 않다.

또는 를 사용합니다.pymysql패키지...

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)

pymysql 및 sqlalchemy를 사용하면 Panda 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.
"""

질문 제목에 SQL Chemy라는 단어가 포함되어 있는 것은 알고 있습니다만, 질문과 답변에서 pymysql 또는 mysql.connector를 Import할 필요가 있음을 알 수 있습니다.또한 pymysql을 사용하여 작업을 수행할 수도 있으며 SQL Chemy를 호출할 수도 있습니다.

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

이 솔루션은 SQL Chemy를 사용하지 않기 때문에 좋다고 생각합니다.

언급URL : https://stackoverflow.com/questions/30631325/writing-to-mysql-database-with-pandas-using-sqlalchemy-to-sql

반응형