Pandas와 SQLAlchemy를 사용하여 Pandas DataFrame을 SQLite 데이터베이스에 저장하는 동안 발생하는 "Engine' object has no attribute 'cursor'" 오류 해결 방법
Pandas DataFrame을 SQLite 데이터베이스에 저장하려고 할 때 다음과 같은 오류가 발생할 수 있습니다.
AttributeError: 'Engine' object has no attribute 'cursor'
이 오류는 일반적으로 SQLAlchemy 버전 0.19.0 이후에 발생하며, Pandas의 to_sql()
메서드가 SQLite 데이터베이스에 연결할 때 cursor
속성을 사용하려고 하기 때문입니다. SQLAlchemy 0.19.0 이후에는 cursor
속성이 더 이상 사용되지 않으므로 이 오류가 발생합니다.
해결 방법
이 오류를 해결하려면 다음 방법 중 하나를 사용하십시오.
create_engine() 함수를 사용하여 연결 만들기
Pandas의 to_sql()
메서드 대신 create_engine()
함수를 사용하여 SQLite 데이터베이스에 직접 연결을 만들 수 있습니다. 다음은 예제입니다.
import pandas as pd
from sqlalchemy import create_engine
# 데이터프레임 준비
df = pd.DataFrame({'col1': [1, 2, 3], 'col2': ['a', 'b', 'c']})
# SQLite 데이터베이스에 연결 만들기
engine = create_engine('sqlite:///mydatabase.db')
# 데이터프레임을 데이터베이스 테이블에 저장
df.to_sql('mytable', engine, if_exists='append', index=False)
connect() 함수를 사용하여 연결 만들기
connect()
함수를 사용하여 SQLite 데이터베이스에 연결을 만들고, Pandas의 to_sql()
메서드에 con
매개변수를 전달하여 연결을 지정할 수도 있습니다. 다음은 예제입니다.
import pandas as pd
from sqlalchemy import create_engine
# 데이터프레임 준비
df = pd.DataFrame({'col1': [1, 2, 3], 'col2': ['a', 'b', 'c']})
# SQLite 데이터베이스에 연결 만들기
engine = create_engine('sqlite:///mydatabase.db')
conn = engine.connect()
# 데이터프레임을 데이터베이스 테이블에 저장
df.to_sql('mytable', conn, if_exists='append', index=False)
# 연결 닫기
conn.close()
SQLAlchemy 0.18.x 버전 사용
마지막으로, SQLAlchemy 0.18.x 버전을 사용하면 cursor
속성을 계속 사용할 수 있습니다. 하지만 이전 버전을 사용하는 것이 좋지 않으므로 위의 두 가지 방법 중 하나를 사용하는 것이 좋습니다.
참고:
- Pandas 버전 1.0.0 이상에서는
to_sql()
메서드가chunksize
매개변수를 지원합니다. 이 매개변수를 사용하면 큰 데이터프레임을 여러 개의 작은 청크로 나누어 데이터베이스에 저장할 수 있습니다. - Pandas 버전 0.25.0 이상에서는
to_sql()
메서드가dtype
매개변수를 지원합니다. 이 매개변수를 사용하면 데이터프레임의 데이터 형식을 데이터베이스 테이블의 열 데이터 형식으로 변환할 수 있습니다.
Pandas와 SQLAlchemy를 사용하여 Pandas DataFrame을 SQLite 데이터베이스에 저장하는 예제 코드
예제 1: create_engine() 함수 사용
import pandas as pd
from sqlalchemy import create_engine
# 데이터프레임 준비
df = pd.DataFrame({'col1': [1, 2, 3], 'col2': ['a', 'b', 'c']})
# SQLite 데이터베이스에 연결 만들기
engine = create_engine('sqlite:///mydatabase.db')
# 데이터프레임을 데이터베이스 테이블에 저장
df.to_sql('mytable', engine, if_exists='append', index=False)
예제 2: connect() 함수 사용
import pandas as pd
from sqlalchemy import create_engine
# 데이터프레임 준비
df = pd.DataFrame({'col1': [1, 2, 3], 'col2': ['a', 'b', 'c']})
# SQLite 데이터베이스에 연결 만들기
engine = create_engine('sqlite:///mydatabase.db')
conn = engine.connect()
# 데이터프레임을 데이터베이스 테이블에 저장
df.to_sql('mytable', conn, if_exists='append', index=False)
# 연결 닫기
conn.close()
설명:
create_engine()
함수는 SQLite 데이터베이스에 연결을 만듭니다.to_sql()
메서드는 Pandas DataFrame을 데이터베이스 테이블에 저장합니다.if_exists
매개변수는 테이블이 이미 존재하는 경우 어떻게 해야 하는지 지정합니다. 'fail'은 테이블이 이미 존재하면 오류를 발생시키고, 'append'는 데이터를 기존 테이블에 추가하고, 'replace'는 기존 테이블을 삭제하고 새 테이블을 만듭니다.index
매개변수는 DataFrame의 인덱스를 데이터베이스 테이블의 열로 저장할지 여부를 지정합니다. False로 설정하면 인덱스가 저장되지 않습니다.
Pandas to_sql to sqlite에서 'Engine' object has no attribute 'cursor' 오류를 해결하는 대체 방법
import pandas as pd
from sqlalchemy import create_engine
# 데이터프레임 준비
df = pd.DataFrame({'col1': [1, 2, 3], 'col2': ['a', 'b', 'c']})
# SQLite 데이터베이스에 연결 만들기
engine = create_engine('sqlite:///mydatabase.db')
# 데이터프레임을 데이터베이스 테이블에 저장
df.to_sql('mytable', engine, if_exists='append', index=False)
import pandas as pd
from sqlalchemy import create_engine
# 데이터프레임 준비
df = pd.DataFrame({'col1': [1, 2, 3], 'col2': ['a', 'b', 'c']})
# SQLite 데이터베이스에 연결 만들기
engine = create_engine('sqlite:///mydatabase.db')
conn = engine.connect()
# 데이터프레임을 데이터베이스 테이블에 저장
df.to_sql('mytable', conn, if_exists='append', index=False)
# 연결 닫기
conn.close()
pandas sqlalchemy