Python連結資料庫,SQL語句查詢這樣操作!
01 前言
Python連結資料庫的方式有幾種,但是原理都是一樣的,總共可以分為兩個步驟,第一步是與資料庫建立連結,第二步執行sql查詢語句,這篇將分別介紹如何與資料庫連結以及如何進行sql語句查詢。
02 與資料庫進行連結
在與資料庫進行連結時,主要用到兩種方法,一種是pymysql.connect,另一種是create_engine。
-
pymysql.connect
pymysql是python自帶的一個庫,使用前需要使用pip install pymysql安裝這個庫,安裝完以後使用該庫中的connect方法可以直接與資料庫進行連結。
# 方法一: 使用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')
這樣就將python與資料庫進行了連結,接下來執行sql查詢語句就可以將資料庫中的內容讀取到python中。
-
create_engine
create_engine是sqlarchemy包內的一個模組,而sqlarchemy是Python下的一款ORM框架,建立在資料庫API之上,使用關係物件對映進行資料庫操作,將物件轉換成SQL,使用資料庫API執行SQL並獲取執行結果。
ORM是Object Relational Mapper ,是一種物件對映關係程式,比較難解釋,大家有興趣的自己去了解一下,這裡只分享如何使用這個進行連結。
# 方法二: 使用create_engine方法
from sqlarchemy import create_engine
create_engine("mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]")
# mysql:資料庫型別
# pymysql:驅動器型別
# username:使用者名稱
# password:密碼
# host:資料庫地址/本機使用localhost
# dbname:資料庫名
# options:資料庫編碼格式如:charset=utf8
# 連線sample
eng = create_engine("mysql+pymysql://zhangjian:[email protected]: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.read_sql()方法讀取資料檔案
import pandas as pd
from sqlalchemy import create_engine
eng = create_engine("mysql+pymysql://zhangjian:ZhangJian*[email protected]: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*[email protected]: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
▲(點選可檢視大圖)
使用connection.cursor()方法讀取資料庫檔案
# 匯入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 讀入資料庫檔案方法總結
-
使用create_engine方法能夠滿足絕大部分資料庫連線與操作命令;
-
資料庫連線資訊包含特殊字串,需要使用mysql.connect()作為連線方法;
-
pd.read_sql()方法讀入資料庫檔案,返回資料框結構,可以快速瀏覽資料彙總;
-
pd.read_sql()使用con引數使用pymsql.connect()方法,sql引數不能直接使用表名稱,需要使用完整的sql語句;
-
使用 cursor() 方法建立遊標的方法讀取sql語句,返回的是包含列資訊的元組,
綜上所述,在pandas框架下使用create_engine 加read_sql()方法,讀取資料庫檔案,程式碼簡潔,易懂,返回的是據框;此方法可避免了資料庫連線工具與python間的切換時間,有利於提高工作效率。
專注於資料科學領域的知識分享
歡迎在文章下方留言與交流