pandas+sqlAlchemy操作數據庫


依賴庫

  • 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: 以回調函數插入


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM