mysqldb를 통해 팬더 데이터 프레임을 데이터베이스에 삽입하려면 어떻게 해야 합니까?
python에서 로컬 mysql 데이터베이스에 접속하여 개별 행을 작성, 선택 및 삽입할 수 있습니다.
질문입니다.mysqldb에게 데이터 프레임 전체를 가져와 기존 테이블에 삽입하도록 직접 지시할 수 있습니까?혹은 행 전체에 걸쳐 반복할 필요가 있습니까?
어느 경우든 ID와 2개의 데이터 컬럼, 일치하는 데이터 프레임이 있는 매우 단순한 테이블에서는 python 스크립트는 어떻게 보일까요?
업데이트:
현재 이 작업을 수행하는 데 권장되는 방법이 있습니다.write_frame
:
df.to_sql(con=con, name='table_name_for_df', if_exists='replace', flavor='mysql')
참고: 팬더 0.14에서는 구문이 변경될 수 있습니다.
MySQLdb와의 연결을 설정할 수 있습니다.
from pandas.io import sql
import MySQLdb
con = MySQLdb.connect() # may need to add some other options to connect
의 설정flavor
write_frame
로로 합니다.'mysql'
에 쓸 수.
sql.write_frame(df, con=con, name='table_name_for_df',
if_exists='replace', flavor='mysql')
" "if_exists
테이블이 이미 존재하는 경우 판다에게 대처법을 알려준다.
if_exists: {'fail', 'replace', 'append'}
, 디폴트, 디폴트'fail'
fail
이 존재할 하지 않습니다 테이블이 존재할 경우 아무것도 하지 마십시오.
replace
이 존재하는 한 후 테이블이 존재하는 경우 테이블을 삭제하고 다시 작성한 후 데이터를 삽입합니다.
append
이 존재하는 테이블이 존재하는 경우 데이터를 삽입합니다.가 존재하지 않는 경우 작성한다.
현재 문서에서는 sqlite에서만 동작할 수 있다고 제안하고 있습니다만, mysql은 서포트되고 있는 것 같습니다.실제로 코드베이스에는 꽤 많은 mysql 테스트가 있습니다.
Andy Hayden이 올바른 to_sql
함수를 언급했습니다().이 답변에서는 Python 3.5에서 테스트했지만 Python 2.7(및 Python 3.x)에서도 사용할 수 있는 완전한 예를 제시하겠습니다.
먼저 데이터 프레임을 만듭니다.
# Create dataframe
import pandas as pd
import numpy as np
np.random.seed(0)
number_of_samples = 10
frame = pd.DataFrame({
'feature1': np.random.random(number_of_samples),
'feature2': np.random.random(number_of_samples),
'class': np.random.binomial(2, 0.1, size=number_of_samples),
},columns=['feature1','feature2','class'])
print(frame)
그 결과:
feature1 feature2 class
0 0.548814 0.791725 1
1 0.715189 0.528895 0
2 0.602763 0.568045 0
3 0.544883 0.925597 0
4 0.423655 0.071036 0
5 0.645894 0.087129 0
6 0.437587 0.020218 0
7 0.891773 0.832620 1
8 0.963663 0.778157 0
9 0.383442 0.870012 0
이 데이터 프레임을 MySQL 테이블로 Import하려면 다음 절차를 수행합니다.
# Import dataframe into MySQL
import sqlalchemy
database_username = 'ENTER USERNAME'
database_password = 'ENTER USERNAME PASSWORD'
database_ip = 'ENTER DATABASE IP'
database_name = 'ENTER DATABASE NAME'
database_connection = sqlalchemy.create_engine('mysql+mysqlconnector://{0}:{1}@{2}/{3}'.
format(database_username, database_password,
database_ip, database_name))
frame.to_sql(con=database_connection, name='table_name_for_df', if_exists='replace')
한가지 트릭은 MySQLdb가 Python 3.x와 함께 동작하지 않는다는 것입니다. 그래서 우리는 대신mysqlconnector
다음과 같이 설치할 수 있습니다.
pip install mysql-connector==2.1.4 # version avoids Protobuf error
출력:
는 테이블과 열이 데이터베이스에 아직 존재하지 않는 경우 해당 열을 작성합니다.
pymysql을 사용하여 수행할 수 있습니다.
예를 들어 다음 사용자, 암호, 호스트 및 포트를 가진 MySQL 데이터베이스가 있고 이미 있는지 여부에 관계없이 데이터베이스 'data_2'에 쓰려고 한다고 가정해 보겠습니다.
import pymysql
user = 'root'
passw = 'my-secret-pw-for-mysql-12ud'
host = '172.17.0.2'
port = 3306
database = 'data_2'
데이터베이스가 이미 작성된 경우:
conn = pymysql.connect(host=host,
port=port,
user=user,
passwd=passw,
db=database,
charset='utf8')
data.to_sql(name=database, con=conn, if_exists = 'replace', index=False, flavor = 'mysql')
데이터베이스가 작성되지 않은 경우 데이터베이스가 이미 존재하는 경우에도 유효합니다.
conn = pymysql.connect(host=host, port=port, user=user, passwd=passw)
conn.cursor().execute("CREATE DATABASE IF NOT EXISTS {0} ".format(database))
conn = pymysql.connect(host=host,
port=port,
user=user,
passwd=passw,
db=database,
charset='utf8')
data.to_sql(name=database, con=conn, if_exists = 'replace', index=False, flavor = 'mysql')
유사한 스레드:
to_sql 메서드가 효과적입니다.
단, SQL Chemy를 위해 폐지될 것으로 생각됩니다.
FutureWarning: The 'mysql' flavor with DBAPI connection is deprecated and will be removed in future versions. MySQL will be further supported with SQLAlchemy connectables. chunksize=chunksize, dtype=dtype)
파이썬 2 + 3
사전 요구 사항
- 판다류
- MySQL 서버
- squalchemy
- pymysql: 순수 python mysql 클라이언트
코드
from pandas.io import sql
from sqlalchemy import create_engine
engine = create_engine("mysql+pymysql://{user}:{pw}@localhost/{db}"
.format(user="root",
pw="your_password",
db="pandas"))
df.to_sql(con=engine, name='table_name', if_exists='replace')
출력할 수 있습니다.DataFrame
csv 파일로 지정한 후mysqlimport
CSV를 로 Import 하다mysql
.
편집
팬더의 빌트인 SQL 유틸리티는write_frame
sqlite에서만 작동합니다.
뭔가 유용한 걸 발견했는데, 이거 한번 써 보세요.
이건 나한테 효과가 있었어.처음에는 데이터베이스만 만들고 미리 정의된 테이블은 만들지 않았습니다.
from platform import python_version
print(python_version())
3.7.3
path='glass.data'
df=pd.read_csv(path)
df.head()
!conda install sqlalchemy
!conda install pymysql
pd.__version__
'0.24.2'
sqlalchemy.__version__
'1.3.20'
설치 후 커널을 재시작했습니다.
from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://USER:PASSWORD@HOST:PORT/DATABASE_NAME', echo=False)
try:
df.to_sql(name='glasstable',con=engine,index=False, if_exists='replace')
print('Sucessfully written to Database!!!')
except Exception as e:
print(e)
이렇게 하면 효과가 있습니다.
import pandas as pd
import pymysql
pymysql.install_as_MySQLdb()
from sqlalchemy import create_engine
# Create engine
engine = create_engine('mysql://USER_NAME_HERE:PASS_HERE@HOST_ADRESS_HERE/DB_NAME_HERE')
# Create the connection and close it(whether successed of failed)
with engine.begin() as connection:
df.to_sql(name='INSERT_TABLE_NAME_HERE/INSERT_NEW_TABLE_NAME', con=connection, if_exists='append', index=False)
df.to_sql(이름 = "소유자", con= db_connection, 스키마 = 'aws', if_sql='replace', 인덱스 = >True, index_label='id')
언급URL : https://stackoverflow.com/questions/16476413/how-to-insert-pandas-dataframe-via-mysqldb-into-database
'source' 카테고리의 다른 글
Python 개체의 메서드 찾기 (0) | 2023.02.01 |
---|---|
딕트를 "완벽하게" 재정의하려면? (0) | 2023.02.01 |
범위를 포함할 때 인덱스에서 먼저 높은 카디널리티 열을 선택하십시오. (0) | 2023.02.01 |
큰 파일을 한 줄씩 읽는 방법 (0) | 2023.01.22 |
Java에서 Integer를 String에 캐스팅할 수 없는 이유는 무엇입니까? (0) | 2023.01.22 |