溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何使用Python實(shí)現(xiàn)從SQL型數(shù)據(jù)庫(kù)讀寫dataframe型數(shù)據(jù)的方法

發(fā)布時(shí)間:2021-04-07 10:54:20 來(lái)源:億速云 閱讀:239 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要介紹如何使用Python實(shí)現(xiàn)從SQL型數(shù)據(jù)庫(kù)讀寫dataframe型數(shù)據(jù)的方法,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

Python的pandas包對(duì)表格化的數(shù)據(jù)處理能力很強(qiáng),而SQL數(shù)據(jù)庫(kù)的數(shù)據(jù)就是以表格的形式儲(chǔ)存,因此經(jīng)常將sql數(shù)據(jù)庫(kù)里的數(shù)據(jù)直接讀取為dataframe,分析操作以后再將dataframe存到sql數(shù)據(jù)庫(kù)中。而pandas中的read_sql和to_sql函數(shù)就可以很方便得從sql數(shù)據(jù)庫(kù)中讀寫數(shù)據(jù)。

read_sql

參見pandas.read_sql的文檔,read_sql主要有如下幾個(gè)參數(shù):

  • sql:SQL命令字符串

  • con:連接sql數(shù)據(jù)庫(kù)的engine,一般可以用SQLalchemy或者pymysql之類的包建立

  • index_col: 選擇某一列作為index

  • coerce_float:非常有用,將數(shù)字形式的字符串直接以float型讀入

  • parse_dates:將某一列日期型字符串轉(zhuǎn)換為datetime型數(shù)據(jù),與pd.to_datetime函數(shù)功能類似??梢灾苯犹峁┬枰D(zhuǎn)換的列名以默認(rèn)的日期形式轉(zhuǎn)換,也可以用字典的格式提供列名和轉(zhuǎn)換的日期格式,比如{column_name: format string}(format string:"%Y:%m:%H:%M:%S")。

  • columns:要選取的列。一般沒(méi)啥用,因?yàn)樵趕ql命令里面一般就指定要選擇的列了

  • chunksize:如果提供了一個(gè)整數(shù)值,那么就會(huì)返回一個(gè)generator,每次輸出的行數(shù)就是提供的值的大小。

  • params:其他的一些執(zhí)行參數(shù),沒(méi)用過(guò)不太清楚。。。

以鏈接常見的mysql數(shù)據(jù)庫(kù)為例:

import pandas as pd
import pymysql
import sqlalchemy
from sqlalchemy import create_engine
# 1. 用sqlalchemy構(gòu)建數(shù)據(jù)庫(kù)鏈接engine
connect_info = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(DB_USER, DB_PASS, DB_HOST, DB_PORT, DATABASE) #1
engine = create_engine(connect_info)
# sql 命令
sql_cmd = "SELECT * FROM table"
df = pd.read_sql(sql=sql_cmd, con=engine)
# 2. 用DBAPI構(gòu)建數(shù)據(jù)庫(kù)鏈接engine
con = pymysql.connect(host=localhost, user=username, password=password, database=dbname, charset='utf8', use_unicode=True)
df = pd.read_sql(sql_cmd, con)

解釋一下 #1: 這個(gè)是sqlalchemy中鏈接數(shù)據(jù)庫(kù)的URL格式:dialect[+driver]://user:password@host/dbname[?key=value..]。dialect代表書庫(kù)局類型,比如mysql, oracle, postgresql。driver代表DBAPI的名字,比如psycopg2,pymysql等。具體說(shuō)明可以參考這里。此外由于數(shù)據(jù)里面有中文的時(shí)候就需要將charset設(shè)為utf8。

to_sql

參見pandas.to_sql函數(shù),主要有以下幾個(gè)參數(shù):

  • name: 輸出的表名

  • con: 與read_sql中相同

  • if_exits: 三個(gè)模式:fail,若表存在,則不輸出;replace:若表存在,覆蓋原來(lái)表里的數(shù)據(jù);append:若表存在,將數(shù)據(jù)寫到原表的后面。默認(rèn)為fail

  • index:是否將df的index單獨(dú)寫到一列中

  • index_label:指定列作為df的index輸出,此時(shí)index為True

  • chunksize: 同read_sql

  • dtype: 指定列的輸出到數(shù)據(jù)庫(kù)中的數(shù)據(jù)類型。字典形式儲(chǔ)存:{column_name: sql_dtype}。常見的數(shù)據(jù)類型有sqlalchemy.types.INTEGER(), sqlalchemy.types.NVARCHAR(),sqlalchemy.Datetime()等,具體數(shù)據(jù)類型可以參考這里

還是以寫到mysql數(shù)據(jù)庫(kù)為例:

df.to_sql(name='table', 
   con=con, 
   if_exists='append', 
   index=False,
   dtype={'col1':sqlalchemy.types.INTEGER(),
     'col2':sqlalchemy.types.NVARCHAR(length=255),
     'col_time':sqlalchemy.DateTime(),
     'col_bool':sqlalchemy.types.Boolean
   })

注:如果不提供dtype,to_sql會(huì)自動(dòng)根據(jù)df列的dtype選擇默認(rèn)的數(shù)據(jù)類型輸出,比如字符型會(huì)以sqlalchemy.types.TEXT類型輸出,相比NVARCHAR,TEXT類型的數(shù)據(jù)所占的空間更大,所以一般會(huì)指定輸出為NVARCHAR;而如果df的列的類型為np.int64時(shí),將會(huì)導(dǎo)致無(wú)法識(shí)別并轉(zhuǎn)換成INTEGER型,需要事先轉(zhuǎn)換成int類型(用map,apply函數(shù)可以方便的轉(zhuǎn)換)。

以上是“如何使用Python實(shí)現(xiàn)從SQL型數(shù)據(jù)庫(kù)讀寫dataframe型數(shù)據(jù)的方法”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI