<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
pandas.read_sql 可以在資料庫中執行指定的SQL語句查詢或對指定的整張表進行查詢,以DataFrame 的型別返回查詢結果,這是在跟資料庫進行互動操作時很重要的一步——既讀取資料,還返回DataFrame方便處理。
要解決的問題: 編寫過的SQL語句需要重複使用,這就涉及到引數,使用引數來替換條件,然後根據需要替換引數。
在沒有使用引數之前,我一直使用的是正則法,也就是利用 re.sub 這個方法將需要的SQL內容替換掉,這樣的好處就是可以替換任意內容,缺點就是必須每次使用的時候 import re.sub。
from re import sub import sqlalchemy import pandas as pd # 建立資料庫連線,這裡使用的是pymysql engine = sqlalchemy.create_engine("mysql+pymysql://username:password@ip:port/store_name") sql = "select * from test where id = 'pid'" # 使用 sub 進行資料替換 data = pd.read_sql(sub("pid", '1', sql), engine)
在這裡使用的時候 pid 是為了統一處理才用的標識名,這樣在以後不管什麼時候都只需要對 pid 進行替換即可。
有一點需要注意的是 sub 替換後的傳入是字串,但是傳入到 替換到SQL中是不會變的。比如
sql = "select * from test where id = pid" data = pd.read_sql(sub("pid", '1', sql), engine)
進行 sub("pid", '1',> sql) 操作後 SQL 變成了
sql select * from test where id = 1
如果 id 欄位是 int 型別那就沒問題,但是如果 id 欄位是 char 或 varchar 等其他型別就會出現欄位型別是字串但給的是數位(mysql 很寬容,不一定會報錯,但是從資料型別上來說肯定是錯了)
pandas.read_sql(sql, con, index_col=None, coerce_float=True, params=None, parse_dates=None, columns=None, chunksize=None)[source]
read_sql 方法中已經有了 params 這個引數,這個就是可以進行引數的傳遞,具體的描述如下
params : list, tuple or dict, optional, default: None
List of parameters to pass to execute method. The syntax used to pass parameters is database driver dependent. Check your database driver documentation for which of the five syntax styles, described in PEP 249’s paramstyle, is supported. Eg. for psycopg2, uses %(name)s so use params={‘name’ : ‘value’}
意思就是可以使用功能 list, tuple or dict 傳遞引數,但是如何怎麼設定引數和傳遞引數需要依據使用的資料庫引擎。PEP 249’s paramstyle 如下表
paramstyle | Meaning |
---|---|
qmark | Question mark style, e.g. …WHERE name=? |
numeric | Numeric, positional style, e.g. …WHERE name=:1 |
named | Named style, e.g. …WHERE name=:name |
format | ANSI C printf format codes, e.g. …WHERE name=%s |
pyformat | Python extended format codes, e.g. …WHERE name=%(name)s |
總結下就是在SQL語句中使用?, :1, :name, %s, %設定引數,然後在params 使用 list, tuple or dict 進行引數的傳遞
from re import sub import sqlalchemy import pandas as pd # 建立資料庫連線 engine = sqlalchemy.create_engine("mysql+pymysql://username:password@ip:port/store_name") sql = "select * from test where id = %(pid)s" # 使用 params 進行引數傳遞 data = pd.read_sql(sql, engine, params={'pid': '1'})
具體的引數就如上面程式碼所示,使用了 %(pid)s 設定引數,再用params={‘pid’: ‘1’}傳遞引數,在Stack Overflow上有個提問也是關於這個的,裡面還有關於psycopg2 和SQLite 的引數傳遞。
之前沒有想過使用引數,是因為在SQL中我不僅要替換固定條件,而且有時候需要替換大段的SQL,所以使用 sub 會更靈活也更模糊(傳入的是字串,到了SQL裡面數位還是字串得再處理一遍),但是使用方法自帶的引數傳遞可以很明確的傳遞正確的資料和資料型別,而且不覺得使用方法自帶的引數傳遞很優雅?
對於引數的傳遞還有另外一種就是python中的字串格式化,format函數可以實現不帶引數、帶索引引數、帶關鍵字引數,python的字串格式化可以參考python格式化輸出
下面是format的使用範例
in : print("{one} are {two} {three}".format(one='you', two=1, three='pig')) out: you are 1 pig
這裡的1應該為a,但是為了演示傳遞整數引數
到此這篇關於pandas中read_sql使用引數進行資料查詢的實現的文章就介紹到這了,更多相關pandas read_sql查詢內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45