source

mysqldb를 통해 팬더 데이터 프레임을 데이터베이스에 삽입하려면 어떻게 해야 합니까?

gigabyte 2023. 2. 1. 21:49
반응형

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

의 설정flavorwrite_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')

유사한 스레드:

  1. SQL Chemy, to_sql을 사용하여 팬더와 MySQL 데이터베이스에 쓰기
  2. MySQL에 Panda 데이터 프레임 쓰기

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

출력할 수 있습니다.DataFramecsv 파일로 지정한 후mysqlimportCSV를 로 Import 하다mysql.

편집

팬더의 빌트인 SQL 유틸리티는write_framesqlite에서만 작동합니다.

뭔가 유용한 걸 발견했는데, 이거 한번 써 보세요.

이건 나한테 효과가 있었어.처음에는 데이터베이스만 만들고 미리 정의된 테이블은 만들지 않았습니다.

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

반응형