天天看點

sqlalchemy exists 子查詢_【S01E04】SQLAlchemy+pandas讀寫資料庫(mysql示例)

I.    sqlalchemy建立mysql連接配接

II.   pd.read_sql()

III.  df.to_sql()
           

I. sqlalchemy建立mysql連接配接

create_engine(*args, **kwargs)    

标準調用方式是将URL作為第一個位置參數
形如``dialect[+driver]://user:[email protected]/dbname[?key=value..]``

dialect    資料庫類型, 如'mysql', 'oracle'
driver     DBAPI的名字, 如'mysqlconnector', 'pymysql' 
           (安裝第一個庫: pip install mysql-connector-python)
user       使用者名, 一般為root
password   密碼
host       IP, 本地連接配接的話為'localhost'
dbname     要連接配接的資料庫的名字
           

舉個例子:

sqlalchemy exists 子查詢_【S01E04】SQLAlchemy+pandas讀寫資料庫(mysql示例)

II. pd.read_sql()

sqlalchemy exists 子查詢_【S01E04】SQLAlchemy+pandas讀寫資料庫(mysql示例)

這個方法其實是read_sql_query和read_sql_table的封裝,read_sql()根據輸入選擇不同的方法執行。

重點參數

sql  表名或查詢語句

con  資料庫連接配接對象, 對于sqlalchemy來說是Engine對象


一般參數

index_col     用作索引的一列或多列
              字元串或字元串的清單, 可選, 預設為None.

coerce_float  嘗試把非字元串, 非數值的對象(如decimal.Decimal)轉換為浮點數

parse_dates   list或dict, 預設為None
              - 要解析為日期的列名清單
              - {column_name: format string}格式的字典, 其中format string是在解析
                字元串時間時相容的strftime, 或者是在解析整數時間戳時, 
                (D, s, ns, ms, us)的其中之一       
              - {column_name: arg dict}格式的字典, 其中arg dict對應到函數
                `pandas.to_datetime`的關鍵字參數
               
columns       從SQL表中選取的列名的清單
              清單, 預設為None

chunksize     如果指定, 則傳回一個疊代器, 'chunksize'是每個塊(chunk)中包含的行數,
              整型, 預設為None

需要注意的是, 時間戳隻會被轉化為UTC, 而不是我們當地的日期和時間, 
是以我們需要手動加上8小時
           

上面的例子是讀取本地資料庫, 下面再寫一個遠端讀取:

sqlalchemy exists 子查詢_【S01E04】SQLAlchemy+pandas讀寫資料庫(mysql示例)

需要注意的是, 這裡時間戳隻會被轉化為UTC, 而不是我們當地的日期和時間(即UTC+8), 是以我們需要手動加上8小時

sqlalchemy exists 子查詢_【S01E04】SQLAlchemy+pandas讀寫資料庫(mysql示例)

III. df.to_sql()

sqlalchemy exists 子查詢_【S01E04】SQLAlchemy+pandas讀寫資料庫(mysql示例)

将存儲在DataFrame中的記錄寫入SQL資料庫。支援所有SQLAlchemy支援的資料庫, 可以新建立(create)一個表, 也可以附加(append), 或者覆寫(overwrite)原有的表

to_sql(self, name, con, schema=None, if_exists='fail', index=True, index_label=None, 
       chunksize=None, dtype=None, method=None)

重點參數

name       SQL表的表名, 字元串

con        sqlalchemy.engine.Engine 或 sqlite3.Connection
           使用SQLAlchemy可以使用該庫支援的任何資料庫

schema     資料庫的名字, 可選, 預設為None, 如果不填, 将使用預設的schema



一般參數

if_exists: 如果表已經存在, 如何操作, {'fail', 'replace', 'append'}中的一種, 預設為'fail'
           * fail: 引發ValueError
           * replace: 在插入新值之前删除表
           * append: 将新值插入到現有表

index      将DataFrame的index索引寫為一列, 使用'index_label'作為表中的列名. 
           bool型, 預設為True

index_label  索引列的列标簽. 字元串或序列, 預設為None
             * 如果index_label為None, 同時index為True, 那麼索引名将被使用(index names)
             * 如果DataFrame使用MultiIndex, 則應該給出一個序列

chunksize    行将按指定的大小分批次寫入. 整型, 可選, 預設為None
             預設一次性寫入所有行

dtype        指定列的資料類型. dict類型, 可選, 預設為None
             字典的鍵為columns names, 字典的值為SQLAlchemy types或
             strings for the sqlite3 legacy mode

method       控制SQL插入子句的使用, {None, 'multi', callable}中的一個, 預設為None
             * None: 使用标準的SQL'INSERT'子句(每行一個)
             * 'multi': 在單個'INSERT'子句内傳遞多個值
             * 帶'(pd_table, conn, keys, data_iter)'簽名的可調用對象 
           

還是舉例說明

sqlalchemy exists 子查詢_【S01E04】SQLAlchemy+pandas讀寫資料庫(mysql示例)
sqlalchemy exists 子查詢_【S01E04】SQLAlchemy+pandas讀寫資料庫(mysql示例)
sqlalchemy exists 子查詢_【S01E04】SQLAlchemy+pandas讀寫資料庫(mysql示例)

繼續閱讀