01 前言
鏈接數據庫的方式有幾種,但是原理都是一樣的,總共可以分為兩個步驟,第一步是與數據庫建立鏈接,第二步執行sql查詢語句,這篇將分別介紹如何與數據庫鏈接以及如何進行sql語句查詢。
02 與數據庫進行鏈接
在與數據庫進行鏈接時,主要用到兩種方法,一種是.c 連接數據庫代碼,另一種是。
是自帶的一個庫,使用前需要使用pip 安裝這個庫,安裝完以后使用該庫中的方法可以直接與數據庫進行鏈接。
#?方法一:?使用pymsql.connect方法
import?pymysql
#?Connect?to?the?database
eng?=?pymysql.connect(host='localhost',
user='user',
password='passwd',
db='db',
charset='utf8')
#?user:用戶名
#?password:密碼
#?host:數據庫地址/本機使用localhost
#?db:數據庫名
#?charset:數據庫編碼
#?連接sample
#?charset='utf8'是解決中文亂碼
eng=pymysql.connect(host="118.190.xxx.xxx",user="zhangjian",password="ZhangJian",db="demo",charset='utf8')
這樣就將與數據庫進行了鏈接c 連接數據庫代碼,接下來執行sql查詢語句就可以將數據庫中的內容讀取到中。
是包內的一個模塊,而是下的一款ORM框架,建立在數據庫API之上,使用關系對象映射進行數據庫操作,將對象轉換成SQL,使用數據庫API執行SQL并獲取執行結果。
ORM是 ,是一種對象映射關系程序,比較難解釋,大家有興趣的自己去了解一下,這里只分享如何使用這個進行鏈接。
#?方法二:?使用create_engine方法
from?sqlarchemy?import?create_engine
create_engine("mysql+pymysql://:@/[?]" )
#?mysql:數據庫類型
#?pymysql:驅動器類型
#?username:用戶名
#?password:密碼
#?host:數據庫地址/本機使用localhost
#?dbname:數據庫名
#?options:數據庫編碼格式如:charset=utf8
#?連接sample
eng?=?create_engine("mysql+pymysql://zhangjian:ZhangJian@118.190.xxx.xxx:3306/demo?charset=utf8")
03 執行sql語句
#?方法一:使用pd.read_sql()?主要參數如下所示
pd.read_sql(
sql,?#需要使用的sql語句或者數據表
con,?#sqlalchemy連接引擎名稱
index_col?=?None,?#將被用作索引的名稱
columns?=?None?#當sql參數使用的是表名稱是,指定需要讀入的列,使用list提供
)
#?方法二:使用pd.read_sql_query?主要參數如下所示
pd.read_sql(
sql,?#完整的sql語句
con,?#sqlalchemy連接引擎名稱
index_col?=?None,?#將被用作索引的名稱
columns?=?None?#當sql參數使用的是表名稱是,指定需要讀入的列,使用list提供
)
#?方法三:使用pd.read_sql_table?主要參數如下所示
pd.read_sql(
table,?#表名稱
con,?#sqlalchemy連接引擎/或者連接名稱
index_col?=?None,?#將被用作索引的名稱
columns?=?None?#當sql參數使用的是表名稱是,指定需要讀入的列,使用list提供
)
#?從以上方法可看出,read_sql()方法已經打包了read_sql_table()?與?read_sql_query()的所有功能,推薦直接使
用read_sql()方法
pd.()方法讀取數據文件
import?pandas?as?pd?
from?sqlalchemy?import?create_engine
eng?=?create_engine("mysql+pymysql://zhangjian:ZhangJian*2018@118.190.000.111:3306/demo?charset=gbk")?
data?=?pd.read_sql(sql?=?'select?*?from?orderitem?limit?10',con=eng,index_col='SDate')
data
#?輸入正確的數據庫新信息后,read_sql方法返回的是我們熟悉的數據框結構,可以方便瀏覽數據,如需查看匯總信息,修改sql語句即可。
▲
(點擊可查看大圖)
#?read_sql()方法sql參數使用表名稱
from?sqlalchemy?import?create_engine
import?pandas?as?pd
eng?=?create_engine("mysql+pymysql://zhangjian:ZhangJian*2018@118.190.000.111:3306/demo?charset=gbk")?
data?=?pd.read_sql(sql?=?"category",con=eng)
#?此方法會讀取指定表中的全部數據,如果表數據量比較大,會造成讀取數據慢,慎用。
#?修改改數據庫密碼后重新連接數據庫
#?如用戶名,密碼,數據庫名稱包含%?@等特殊字符串報錯如下所示:報錯關鍵信息1045
eng?=?create_engine("mysql+pymysql://賬號:密碼@118.190.000.111:3306/demo?charset=gbk")?
data?=?pd.read_sql(sql?=?'select?*?from?orderitem?limit?10',con=eng)
data
OperationalError??????????????????????????Traceback?(most?recent?call?last)
C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py?in?_wrap_pool_connect(self,?fn,?connection)
???2157?????????try:
->?2158?????????????return?fn()
???2159?????????except?dialect.dbapi.Error?as?e:
▲
(點擊可查看大圖)
#?用戶名,密碼,數據庫名稱包含特殊字符串報錯解決方法
#?方法二:使用pymysql.connect()方法建立連接
import?pymysql
eng?=?pymysql.connect("118.190.000.111","zhangjian","zhangjiang*2018","demo"?)
data?=?pd.read_sql(sql?=?"select?*?from?orderitem?limit?10"?,con=eng)
data
▲
(點擊可查看大圖)
#?pymsql.connect連接,讀入指定表名稱,會報錯,關鍵信息1064
eng=pymysql.connect(host="118.190.000.111",user="zhagnjian",password="zhangjian*2018",db="demo"?,charset='utf8')
data?=?pd.read_sql(sql?=?"category",con=eng)
data
▲
(點擊可查看大圖)
使用.()方法讀取數據庫文件
#?導入sql文件?使用官方文檔案例方法
#導入數據庫模塊
import?pymysql
#?連接數據庫
eng?=?pymysql.connect("118.190.000.111","zhangjian","ZhangJian*2018","demo"?)
#?使用?cursor()?方法創建一個游標對象?cursor
cursor?=?eng.cursor()
#?編寫sql語句
sql?=?"""
select?*?from?orderitem?limit?10;
"""
#?使用?execute()?方法執行?SQL?查詢
cursor.execute(sql)
#?使用?fetchall()?方法獲取所有數據.
data?=?cursor.fetchall()
#?關閉數據庫連接
eng.close()
#?返回元組
data
#?返回信息包括數據類型等數據列信息
▲
(點擊可查看大圖)
#?將元組轉化為DataFrame
df2?=?pd.DataFrame(data?=?list(data)?,columns?=?['SDate',?'ShopID',?'SheetID',?'GoodsID',
'CateID',?'Qty',?'CostValue','SaleValue',?'OriSaleValue',?'Cost',?'Price']?)
df2
04 讀入數據庫文件方法總結
綜上所述,在框架下使用 加()方法,讀取數據庫文件,代碼簡潔,易懂,返回的是據框;此方法可避免了數據庫連接工具與間的切換時間,有利于提高工作效率。
End.