-點擊上方“中國統(tǒng)計網(wǎng)”訂閱我吧!-
01 前言
鏈接數(shù)據(jù)庫的方式有幾種,但是原理都是一樣的,總共可以分為兩個步驟,第一步是與數(shù)據(jù)庫建立鏈接,第二步執(zhí)行sql查詢語句,這篇將分別介紹如何與數(shù)據(jù)庫鏈接以及如何進行sql語句查詢。
02 與數(shù)據(jù)庫進行鏈接
在與數(shù)據(jù)庫進行鏈接時,主要用到兩種方法,一種是.,另一種是。
是自帶的一個庫,使用前需要使用pip 安裝這個庫,安裝完以后使用該庫中的方法可以直接與數(shù)據(jù)庫進行鏈接。
# 方法一: 使用pymsql.connect方法
import pymysql
# Connect to the database
eng = pymysql.connect(host='localhost',
user='user',
password='passwd',
db='db',
charset='utf8')
# user:用戶名
# password:密碼
# host:數(shù)據(jù)庫地址/本機使用localhost
# db:數(shù)據(jù)庫名
# charset:數(shù)據(jù)庫編碼
# 連接sample
# charset='utf8'是解決中文亂碼
eng=pymysql.connect(host="118.190.xxx.xxx",user="zhangjian",password="ZhangJian",db="demo",charset='utf8')
這樣就將與數(shù)據(jù)庫進行了鏈接c 連接數(shù)據(jù)庫代碼,接下來執(zhí)行sql查詢語句就可以將數(shù)據(jù)庫中的內(nèi)容讀取到中。
是包內(nèi)的一個模塊,而是下的一款ORM框架,建立在數(shù)據(jù)庫API之上,使用關(guān)系對象映射進行數(shù)據(jù)庫操作,將對象轉(zhuǎn)換成SQL,使用數(shù)據(jù)庫API執(zhí)行SQL并獲取執(zhí)行結(jié)果。
ORM是 ,是一種對象映射關(guān)系程序c 連接數(shù)據(jù)庫代碼,比較難解釋,大家有興趣的自己去了解一下,這里只分享如何使用這個進行鏈接。
# 方法二: 使用create_engine方法
from sqlarchemy import create_engine
create_engine("mysql+pymysql://
: @ / [? ]") # mysql:數(shù)據(jù)庫類型
# pymysql:驅(qū)動器類型
# username:用戶名
# password:密碼
# host:數(shù)據(jù)庫地址/本機使用localhost
# dbname:數(shù)據(jù)庫名
# options:數(shù)據(jù)庫編碼格式如:charset=utf8
# 連接sample
eng = create_engine("mysql+pymysql://zhangjian:ZhangJian@118.190.xxx.xxx:3306/demo?charset=utf8")
03 執(zhí)行sql語句
# 方法一:使用pd.read_sql() 主要參數(shù)如下所示
pd.read_sql(
sql, #需要使用的sql語句或者數(shù)據(jù)表
con, #sqlalchemy連接引擎名稱
index_col = None, #將被用作索引的名稱
columns = None #當(dāng)sql參數(shù)使用的是表名稱是,指定需要讀入的列,使用list提供
)
# 方法二:使用pd.read_sql_query 主要參數(shù)如下所示
pd.read_sql(
sql, #完整的sql語句
con, #sqlalchemy連接引擎名稱
index_col = None, #將被用作索引的名稱
columns = None #當(dāng)sql參數(shù)使用的是表名稱是,指定需要讀入的列,使用list提供
)
# 方法三:使用pd.read_sql_table 主要參數(shù)如下所示
pd.read_sql(
table, #表名稱
con, #sqlalchemy連接引擎/或者連接名稱
index_col = None, #將被用作索引的名稱
columns = None #當(dāng)sql參數(shù)使用的是表名稱是,指定需要讀入的列,使用list提供
)
# 從以上方法可看出,read_sql()方法已經(jīng)打包了read_sql_table() 與 read_sql_query()的所有功能,推薦直接使
用read_sql()方法
pd.()方法讀取數(shù)據(jù)文件
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
#?輸入正確的數(shù)據(jù)庫新信息后,read_sql方法返回的是我們熟悉的數(shù)據(jù)框結(jié)構(gòu),可以方便瀏覽數(shù)據(jù),如需查看匯總信息,修改sql語句即可。
▲(點擊可查看大圖)
# read_sql()方法sql參數(shù)使用表名稱
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)
#?此方法會讀取指定表中的全部數(shù)據(jù),如果表數(shù)據(jù)量比較大,會造成讀取數(shù)據(jù)慢,慎用。
# 修改改數(shù)據(jù)庫密碼后重新連接數(shù)據(jù)庫
# 如用戶名,密碼,數(shù)據(jù)庫名稱包含% @等特殊字符串報錯如下所示:報錯關(guān)鍵信息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:
▲(點擊可查看大圖)
# 用戶名,密碼,數(shù)據(jù)庫名稱包含特殊字符串報錯解決方法
# 方法二:使用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連接,讀入指定表名稱,會報錯,關(guān)鍵信息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()方法讀取數(shù)據(jù)庫文件
# 導(dǎo)入sql文件 使用官方文檔案例方法
#導(dǎo)入數(shù)據(jù)庫模塊
import pymysql
# 連接數(shù)據(jù)庫
eng = pymysql.connect("118.190.000.111","zhangjian","ZhangJian*2018","demo" )
# 使用 cursor() 方法創(chuàng)建一個游標(biāo)對象 cursor
cursor = eng.cursor()
# 編寫sql語句
sql = """
select * from orderitem limit 10;
"""
# 使用 execute() 方法執(zhí)行 SQL 查詢
cursor.execute(sql)
# 使用 fetchall() 方法獲取所有數(shù)據(jù).
data = cursor.fetchall()
# 關(guān)閉數(shù)據(jù)庫連接
eng.close()
# 返回元組
data
# 返回信息包括數(shù)據(jù)類型等數(shù)據(jù)列信息
▲(點擊可查看大圖)
#?將元組轉(zhuǎn)化為DataFrame
df2 = pd.DataFrame(data = list(data) ,columns = ['SDate', 'ShopID', 'SheetID', 'GoodsID',
'CateID', 'Qty', 'CostValue','SaleValue', 'OriSaleValue', 'Cost', 'Price'] )
df2
04 讀入數(shù)據(jù)庫文件方法總結(jié)
綜上所述,在框架下使用 加()方法,讀取數(shù)據(jù)庫文件,代碼簡潔,易懂,返回的是據(jù)框;此方法可避免了數(shù)據(jù)庫連接工具與間的切換時間,有利于提高工作效率。
End.