依賴庫
- pandas
- sqlalchemy
- pymysql
讀取數據庫
from sqlalchemy import create_engine
import pandas as pd
# 創建數據庫連接對象
win_user = 'root' # 數據庫用戶名
win_password = '123456' # 數據庫密碼
win_host = 'localhost' # 數據庫ip地址
win_port=3306 # 端口號
win_test = test # 數據庫
engine = create_engine(f'mysql+pymysql://{win_user}:{win_password}@{win_host}:{win_port}/{win_test}', echo=True)
# sql語句
sql = 'SELECT * FFROM test'
# 通過pandas讀取數據
data = pd.read_sql(sql,engine)
寫入數據庫
from sqlalchemy import create_engine
import pandas as pd
# 創建數據庫連接對象
win_user = 'root' # 數據庫用戶名
win_password = '123456' # 數據庫密碼
win_host = 'localhost' # 數據庫ip地址
win_port=3306 # 端口號
win_test = test # 數據庫
engine = create_engine(f'mysql+pymysql://{win_user}:{win_password}@{win_host}:{win_port}/{win_test}', echo=True)
# sql語句
sql = 'SELECT * FFROM test'
# 通過pandas讀取數據
data = pd.read_sql(sql,engine)
# 數據進行處理
# 處理好的數據寫入到數據庫
data.to_sql('表名', engine) # 表不存在直接創建
參數
- read_sql()
pandas.read_sql(sql,
con,
index_col=None,
coerce_float=True,
params=None,
parse_dates=None,
columns=None,
chunksize=None)
sql: SQL命令字符串
con: 連接sql數據庫的engine,一般可以用SQLalchemy或者pymysql之類的包建立
index_col: 選擇某一列作為index
coerce_float: 將數字形式的字符串直接以float型讀入
parse_dates: 將某一列日期型字符串轉換為datetime型數據,與pd.to_datetime函數功能類似。可以直接提供需要轉換的列名以默認的日期形式轉換,也可以用字典的格式提供列名和轉換的日期格式,比如{column_name: format string}(format string:"%Y:%m:%H:%M:%S")。
columns: 要選取的列。一般沒啥用,因為在sql命令里面一般就指定要選擇的列
chunksize:如果提供了一個整數值,那么就會返回一個generator,每次輸出的行數就是提供的值的大小。
- to_sql()
data.to_sql(name,
con,
schema=None,
if_exists="fail",
index=True,
index_label=None,
chunksize=None,
dtype=None,
method=None)
name: 要寫入表的名字
con: 創建數據庫連接的對象。
schema: 用於創建數據庫對象,基本上都是使用默認值。
if_exists:如果表存在怎么辦?
- fail:拋出ValueError異常、
- replace:在插入數據之前刪除表。注意不是僅刪除數據,是刪除原來的表,重新建表.
- append:插入新數據。如果有主鍵,要避免主鍵沖突;看清表的格式,DataFrame的columns與表的columns是對應的;DF的index默認是作為一列數據的,也就是說默認會寫入數據庫的,
index: 將索引作為一列寫入數據庫,默認為True,也就是說默認DF的索引是要寫入數據庫的,index_label為列名
index_label: 將索引寫入數據庫時的列名,默認為index;如果DF是多級索引,則index_label應為一個序列
chunksize: 批處理,每次處理多少條數據。默認全部,一般沒啥用,除非數據量太大,明顯感覺卡的時候可以分批處理。
dtype: 一個字典,指定列的數據類型。鍵是列的名字,值是sqlalchemy types或者sqlite3的字符串形式。如果是新建表,則需要指定類型,不然會以存儲量最大類型作為默認類型。比如varchar類型就會成為text類型,空間資源浪費很多。如果是添加數據,則一般不需要規定該參數。
method:哪種類型的插入語句?
- None: 默認單行插入
- multi: 多行插入
- callable: 以回調函數插入
