Python連接SQL?server數(shù)據(jù)庫(kù)并進(jìn)行簡(jiǎn)單查詢(xún)的操作詳解
前言
學(xué)習(xí)Python 連接 數(shù)據(jù)庫(kù)
解決問(wèn)題:
1:如何連接數(shù)據(jù)庫(kù)
2:如何進(jìn)行簡(jiǎn)單查詢(xún)
3:如何將查詢(xún)中的中文亂碼給修復(fù)
4:如何進(jìn)行插入,更新,刪除
一、如何連接數(shù)據(jù)庫(kù)?
#pip install pymssql 先安裝
import pymssql #導(dǎo)入模塊
connect = pymssql.connect('(local)','sa','123456','School')
#connect = pymssql.connect('服務(wù)器名稱(chēng)', '用戶(hù)名', '密碼', '庫(kù)名') # 建立連接
if connect:
print("連接成功")
#輸出
連接成功
二、如何進(jìn)行簡(jiǎn)單查詢(xún)
cursor = connect.cursor()#創(chuàng)建一個(gè)游標(biāo)對(duì)象python里的sql語(yǔ)句都要通過(guò)cursor來(lái)執(zhí)行
sql="select * from Student" #一個(gè)簡(jiǎn)單的sql查詢(xún)語(yǔ)句
cursor.execute(sql)#執(zhí)行sql語(yǔ)句
row = cursor.fetchone() #用fetchone 獲取游標(biāo)的數(shù)據(jù),如果是首次就定位首行
while row: # 循環(huán)讀取所有結(jié)果
print(row)
row = cursor.fetchone()#取下一個(gè)內(nèi)容
cursor.close()
connect.close()
#結(jié)果出現(xiàn)亂碼,下面我們解決
<pymssql._pymssql.Connection object at 0x0000025DBDEE9F00>
連接成功
(2021402075, '???×', '?D', datetime.datetime(1900, 2, 7, 0, 0), 'MA')
(2021402076, '???×', '?D', datetime.datetime(2003, 3, 18, 0, 0), 'CS')
(2021402077, '′oò°ó£', '??', datetime.datetime(2009, 4, 20, 0, 0), 'MA')
(2021402078, '′oè?ò°?·', '??', datetime.datetime(2003, 6, 20, 0, 0), 'CS')
(2021402079, 'è??ò3?ì?', '??', datetime.datetime(2006, 7, 7, 0, 0), 'MA')
(2021402080, '?è?à', '??', datetime.datetime(2003, 6, 6, 0, 0), 'CS')
三、如何將查詢(xún)中的中文亂碼給修復(fù)
方法一
主要在pymssql.connect 中添加charset = ‘cp936’
原因:因?yàn)樽址侄晤?lèi)型為:varchar,造成讀取數(shù)據(jù)亂碼。
import pymssql #導(dǎo)入模塊
connect = pymssql.connect('(local)','sa','123456','School',charset='cp936') #connect = pymssql.connect('服務(wù)器名稱(chēng)', '用戶(hù)名', '密碼', '庫(kù)名') # 建立連接
if connect:
print(connect)
print("連接成功")
cursor = connect.cursor()
sql = "select * from Student"
cursor.execute(sql)
row = cursor.fetchone()
while row:
print(row)
row = cursor.fetchone()
cursor.close()
connect.close()
#結(jié)果
<pymssql._pymssql.Connection object at 0x00000115E49A9FC0>
連接成功
(2021402075, '蕭炎', '男', datetime.datetime(1900, 2, 7, 0, 0), 'MA')
(2021402076, '蕭炎', '男', datetime.datetime(2003, 3, 18, 0, 0), 'CS')
(2021402077, '春野櫻', '女', datetime.datetime(2009, 4, 20, 0, 0), 'MA')
(2021402078, '春日野穹', '女', datetime.datetime(2003, 6, 20, 0, 0), 'CS')
(2021402079, '日向雛田', '女', datetime.datetime(2006, 7, 7, 0, 0), 'MA')
(2021402080, '娜美', '女', datetime.datetime(2003, 6, 6, 0, 0), 'CS')
#成功完美的查詢(xún)
方法一的缺點(diǎn):
如果SQL語(yǔ)句中含有中文,就會(huì)得不到數(shù)據(jù),如sql中有:where table_colum = ‘魏本明’;即便將sql語(yǔ)句:sql.encode(‘cp936’),也不行??!
方法二
更通用全部
直接用sql語(yǔ)句將varchar轉(zhuǎn)為nvarchar類(lèi)型,不再需要指定charset了,就沒(méi)問(wèn)題了(注意轉(zhuǎn)換列名稱(chēng)起別名),直接寫(xiě)sql語(yǔ)句如下
select convert(nvarchar(50),table_colum) as 'nvarchar_colum' from mytable where convert(nvarchar(50),table_colum) = '魏本明' 就是將需要轉(zhuǎn)換的列(如,varchar),轉(zhuǎn)換為nvarchar,也可以完成
例如:
import pymssql #導(dǎo)入模塊
connect = pymssql.connect('(local)','sa','123456','School') #connect = pymssql.connect('服務(wù)器名稱(chēng)', '用戶(hù)名', '密碼', '庫(kù)名') # 建立連接
if connect:
print(connect)
print("連接成功")
cursor = connect.cursor()#創(chuàng)建一個(gè)游標(biāo)對(duì)象python里的sql語(yǔ)句都要通過(guò)cursor來(lái)執(zhí)行
sql="select Ssno,convert(nvarchar(50),Snam) as 'a',convert(nvarchar(50),Ssex) as 'b' from Student"
cursor.execute(sql)#執(zhí)行語(yǔ)句
row = cursor.fetchone()#用fetchone 獲取游標(biāo)的數(shù)據(jù),如果是首次就定位首行
print(row)
while row: # 循環(huán)讀取所有結(jié)果
print("id=%s,Name=%s,Sex=%s" % (row[0], row[1], row[2])) # 輸出結(jié)果
row = cursor.fetchone()#取下一個(gè)內(nèi)容
cursor.close()
connect.close()
結(jié)果:
<pymssql._pymssql.Connection object at 0x0000019C35BBC0C0>
連接成功
(2021402075, '蕭炎', '男', datetime.datetime(1900, 2, 7, 0, 0), 'MA')
(2021402076, '蕭炎', '男', datetime.datetime(2003, 3, 18, 0, 0), 'CS')
(2021402077, '春野櫻', '女', datetime.datetime(2009, 4, 20, 0, 0), 'MA')
(2021402078, '春日野穹', '女', datetime.datetime(2003, 6, 20, 0, 0), 'CS')
(2021402079, '日向雛田', '女', datetime.datetime(2006, 7, 7, 0, 0), 'MA')
(2021402080, '娜美', '女', datetime.datetime(2003, 6, 6, 0, 0), 'CS')
四、如何進(jìn)行插入,更新,刪除
進(jìn)行更新數(shù)據(jù)的操作都要用到connect.commit()函數(shù)
update,delete,insert等修改表中數(shù)據(jù)的需要commit
commit字面意思就是 投入
然后更改表的結(jié)構(gòu)就不用了,因?yàn)樗麄儍?nèi)置了commit
create,drop,alter等修改表結(jié)構(gòu)的,就不需要commit,因?yàn)閮?nèi)部隱藏了commit
不行的時(shí)候加上conn.autocommit(True)
推薦先在SQL中查看語(yǔ)句有沒(méi)有語(yǔ)法錯(cuò)誤在放回來(lái)運(yùn)行,能解決你50%以上的報(bào)錯(cuò)
總結(jié)
我下面進(jìn)行一個(gè)小項(xiàng)目全部都在python中完成
目標(biāo):
1:創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)
2:創(chuàng)建一個(gè)表
3:為這個(gè)表插入數(shù)據(jù)
4:更新插入的數(shù)據(jù)
5:查詢(xún)前三行數(shù)據(jù)
6:插入一列屬性
import pymssql
# 1:創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)
conn = pymssql.connect('.','sa','123456')#單純連接數(shù)據(jù)庫(kù)
if conn:
print("連接成功")
cursor = conn.cursor() #創(chuàng)建執(zhí)行語(yǔ)句
conn.autocommit(True) #創(chuàng)建庫(kù)的核心!!!
sql_DATA ="""
CREATE DATABASE PY_DATA
ON PRIMARY
(NAME = 'PY_DATA',
FILENAME = 'D:\DATA\PY_DATA.MDF' ,
SIZE = 5MB,
MAXSIZE = 20MB,
FILEGROWTH = 20%)
LOG ON
(NAME ='PY_DATA_LOG',
FILENAME = 'D:\DATA\PY_DATA_LOG. LDF',
SIZE = 5MB,
MAXSIZE = 10MB,
FILEGROWTH = 2MB)
"""
cursor.execute(sql_DATA)
cursor.close()
conn.autocommit(False)
conn.close()
----------------------------------------------------------------------------
#2:創(chuàng)建一個(gè)表
import pymssql
##連接
conn = pymssql.connect('.','sa','123456','School')
if conn:
print("連接成功")
##操作
cursor = conn.cursor()
conn.autocommit(True)#是修改表的結(jié)構(gòu)都要有嗎?
sql_TABLE = """
Create Table Student_3(
ID int primary key,
Name varchar(50),
Age int)
"""
cursor.execute(sql_TABLE)
conn.autocommit(False)
conn.close()
----------------------------------------------------------------------------
3:為這個(gè)表插入數(shù)據(jù)
import pymssql
conn = pymssql.connect('.','sa','123456','PY_DATA')
if conn:
print("True")
cursor = conn.cursor()
a = "松仁、秉峰、泳紀(jì)海奉、威劍、頌和、祥益、騰恩、柏鑠、孟深、忠莊、軒哲、鎧鑫、仕倫、儒億、積進(jìn)信欽、賢元、程基、安泉、樹(shù)昌、祝斌、一科、游湖、普濟(jì)、中堅(jiān)"
a = a.split("、")
for i in range(len(a)):
sql_insert = f"insert into Student Values({i},'{a[i]}',18)"
print(sql_insert)
cursor.execute(sql_insert)
conn.commit()
cursor.close()
conn.close()
----------------------------------------------------------------------------
4:更新插入的數(shù)據(jù)
import pymssql
conn = pymssql.connect('.','sa','123456','PY_DATA')
if conn:
print("True")
cursor = conn.cursor()
sql_updata = "update student set Name='消息' where ID = 12"
cursor.execute(sql_updata)
conn.commit()
cursor.close()
conn.close()
----------------------------------------------------------------------------
5:查詢(xún)前三行數(shù)據(jù)
import pymssql
conn = pymssql.connect('.','sa','123456','PY_DATA',charset='cp936')
if conn:
print("True")
cursor = conn.cursor()
sql_select = "Select Top 3 * From Student"
cursor.execute(sql_select)
row =1
while row:
row = cursor.fetchone()
print(row)
cursor.close()
conn.close()
----------------------------------------------------------------------------
6:插入一列屬性
import pymssql
conn = pymssql.connect('.','sa','123456','School')
cursor = conn.cursor()
conn.autocommit(True)
sql_insertbase = "Alter table Student_3 add idname int Null"
cursor.execute(sql_insertbase)
cursor.close()
conn.close()
以上就是Python連接SQL server數(shù)據(jù)庫(kù)詳細(xì)流程的詳細(xì)內(nèi)容,更多關(guān)于Python連接SQL server的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python游戲的魅力之冒險(xiǎn)島實(shí)戰(zhàn)項(xiàng)目
我看了一眼沉迷《夢(mèng)幻國(guó)度》的兒子!氣就不打一處來(lái)!讓你見(jiàn)識(shí)一下Python游戲的魅力,python實(shí)戰(zhàn)冒險(xiǎn)島游戲碼起,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值2021-09-09
Python實(shí)現(xiàn)加載及解析properties配置文件的方法
這篇文章主要介紹了Python實(shí)現(xiàn)加載及解析properties配置文件的方法,結(jié)合實(shí)例形式分析了Python針對(duì)properties配置文件的加載、讀取及解析相關(guān)操作技巧,需要的朋友可以參考下2018-03-03
Python實(shí)現(xiàn)提取Word文檔中的文本和圖片
將內(nèi)容從?Word?文檔中提取出來(lái)可以方便我們對(duì)其進(jìn)行其他操作,如將內(nèi)容儲(chǔ)存在數(shù)據(jù)庫(kù)中,本文將介紹如何使用簡(jiǎn)單的代碼實(shí)現(xiàn)從?Word?文檔中提取文本和圖片內(nèi)容并保存,需要的可以參考下2023-12-12
Flask如何結(jié)合Jinja2模板引擎返回渲染后HTML
在 Flask 中結(jié)合 Jinja2 模板引擎返回渲染后的 HTML 是核心功能之一,本文主要介紹了詳細(xì)實(shí)現(xiàn)方法和最佳實(shí)踐,有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-06-06
關(guān)于keras中keras.layers.merge的用法說(shuō)明
這篇文章主要介紹了關(guān)于keras中keras.layers.merge的用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05

