Pythonからローカルmysqlデータベースに接続でき、個々の行を作成、選択、挿入できます。
私の質問は、データフレーム全体を取得して既存のテーブルに挿入するようにmysqldbに直接指示できますか、または行を反復処理する必要がありますか?
どちらの場合でも、IDと2つのデータ列、および一致するデータフレームを持つ非常に単純なテーブルの場合、pythonスクリプトはどのようになりますか?
現在、 to_sql
メソッドがあります。これは、write_frame
ではなく、これを行うための好ましい方法です。
df.to_sql(con=con, name='table_name_for_df', if_exists='replace', flavor='mysql')
また、構文はpandas 0.14 ...
MySQLdb を使用して接続をセットアップできます。
from pandas.io import sql
import MySQLdb
con = MySQLdb.connect() # may need to add some other options to connect
write_frame
のflavor
を'mysql'
に設定すると、mysqlに書き込むことができます。
sql.write_frame(df, con=con, name='table_name_for_df',
if_exists='replace', flavor='mysql')
引数if_exists
は、pandasテーブルが既に存在する場合の対処方法:
if_exists: {'fail', 'replace', 'append'}
、デフォルト'fail'
fail
:テーブルが存在する場合、何もしません。replace
:テーブルが存在する場合は、ドロップしてから再作成し、データを挿入します。append
:テーブルが存在する場合、データを挿入します。存在しない場合は作成します。
write_frame
docs は現在sqliteでのみ動作することを示唆していますが、mysqlはサポートされているようで、実際にはかなり多くの がありますコードベースでのmysqlテスト 。
アンディ・ヘイデンは正しい関数に言及した( 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 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')
1つのトリックは、 MySQLdb がPython 3.xで動作しないため、代わりにmysqlconnector
は、次のように installed になります。
pip install mysql-connector==2.1.4 # version avoids Protobuf error
出力:
to_sql
は、テーブルと列がデータベースにまだ存在しない場合、それらを作成します。
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メソッドは私のために機能します。
ただし、SQLAlchemyを使用して非推奨になるように見えることに注意してください。
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)
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をmysql
にインポートします。
pandasのビルトインsql util はwrite_frame
関数ですが、sqliteでのみ機能します。
私は何か有用なものを見つけました、あなたは this を試すかもしれません