昨天在李哥幫忙檢驗我學習效果的時候
我使用pymysql出現了以下的錯誤
python-module 'pymysql' has no attribute 'connect'
一出錯 我本能的想去看下是不是我沒連接成功 然后 pip3 install pymysql
不要起import的包名作為文件名啊!!!
因此,我總結了下pymysql的基本使用
一、PyMySQL介紹
PyMySQL是在 Python3.x 版本中用於連接 MySQL 服務器的一個庫,Python2中是使用mysqldb。
PyMySQL安裝
pip3 install pymysql
創建鏈接的基本使用
# 導入pymysql模塊
import pymysql
# 連接database
conn = pymysql.connect(
host=“你的數據庫地址”,
user=“用戶名”,password=“密碼”,
database=“數據庫名”,
charset=“utf8”)
# 得到一個可以執行SQL語句的光標對象
cursor = conn.cursor() # 執行完畢返回的結果集默認以元組顯示
# 得到一個可以執行SQL語句並且將結果作為字典返回的游標
#cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 定義要執行的SQL語句
sql = """
CREATE TABLE USER1 (
id INT auto_increment PRIMARY KEY ,
name CHAR(10) NOT NULL UNIQUE,
age TINYINT NOT NULL
)ENGINE=innodb DEFAULT CHARSET=utf8; #注意:charset='utf8' 不能寫成utf-8
"""
# 執行SQL語句
cursor.execute(sql)
# 關閉光標對象
cursor.close()
# 關閉數據庫連接
conn.close()
在建鏈接之前,我們需要做好一些前期工作:建庫建表
下面例子中 我將使用我建好的庫:db= 'xing'
建好的userinfo表

簡單驗證功能
# pip3 install pymysql
import pymysql
user=input('user>>: ').strip()
pwd=input('password>>: ').strip()
# 建立鏈接
conn=pymysql.connect(
host='192.168.0.103',#我的IP地址
port=3306, # 不是字符串不需要加引號。
user='root',
password='123',
db='xing',
charset='utf8'
)
# 拿到游標
cursor=conn.cursor()
# 執行sql語句
sql='select * from userinfo where user = "%s" and pwd="%s"' % (user, pwd)
print(sql)
res=cursor.execute(sql)
print(res)
cursor.close()
conn.close()
# 進行判斷
if res:
print('登錄成功')
else:
print('登錄失敗')
輸出結果:

但是會有以下問題:輸入的SQL 語句被注釋了

或者是

這個時候之后 我們可以這樣解決
execute幫我們做字符串拼接 # 將以下代碼 sql="select * from userinfo where name='%s' and password='%s'" %(user,pwd) res=cursor.execute(sql) # 改為 sql="select * from userinfo where name=%s and password=%s" #%s需要去掉引號,pymysql會自動加上 res=cursor.execute(sql,[user,pwd])
輸出結果:


二、增刪改查操作
添加多條數據
import pymysql
conn = pymysql.connect(
host='192.168.0.103',
port=3306,
user='root',
password='123',
database='xing',
charset='utf8'
)
# 獲取一個光標
cursor = conn.cursor()
# 定義要執行的sql語句
sql = 'insert into userinfo(user,pwd) values(%s,%s);'
data = [
('july', '147'),
('june', '258'),
('marin', '369')
]
# 拼接並執行sql語句
cursor.executemany(sql, data)
# 涉及寫操作要注意提交
conn.commit()
# 關閉連接
cursor.close()
conn.close()
輸出結果:

插入單條數據
import pymysql
conn =pymysql.connect(
host ='192.168.0.103',
port = 3306,
user = 'root',
password ='123',
database ='xing',
charset ='utf8'
)
cursor =conn.cursor() #獲取一個光標
sql ='insert into userinfo (user,pwd) values (%s,%s);'
name = 'wuli'
pwd = '123456789'
cursor.execute(sql, [name, pwd])
conn.commit()
cursor.close()
conn.close()
輸出結果:
獲取最新插入數據 (最后一條)
import pymysql
# 建立連接
conn = pymysql.connect(
host="192.168.0.103",
port=3306,
user="root",
password="123",
database="xing",
charset="utf8"
)
# 獲取一個光標
cursor = conn.cursor()
# 定義將要執行的SQL語句
sql = "insert into userinfo (user, pwd) values (%s, %s);"
name = "wuli"
pwd = "123456789"
# 並執行SQL語句
cursor.execute(sql, [name, pwd])
# 涉及寫操作注意要提交
conn.commit()
# 關閉連接
# 獲取最新的那一條數據的ID
last_id = cursor.lastrowid
print("最后一條數據的ID是:", last_id)
cursor.close()
conn.close()
輸出結果為:(因為我之前插入多條記錄時,多運行了兩次,所有結果下面的這個)


刪除操作
import pymysql
# 建立連接
conn = pymysql.connect(
host="192.168.0.103",
port=3306,
user="root",
password="123",
database="xing",
charset="utf8"
)
# 獲取一個光標
cursor = conn.cursor()
# 定義將要執行的SQL語句
sql = "delete from userinfo where user=%s;"
name = "june"
# 拼接並執行SQL語句
cursor.execute(sql, [name])
# 涉及寫操作注意要提交
conn.commit()
# 關閉連接
cursor.close()
conn.close()
輸出結果是:

更改數據
import pymysql
# 建立連接
conn = pymysql.connect(
host="192.168.0.103",
port=3306,
user="root",
password="123",
database="xing",
charset="utf8"
)
# 獲取一個光標
cursor = conn.cursor()
# 定義將要執行的SQL語句
sql = "update userinfo set pwd=%s where user=%s;"
# 拼接並執行SQL語句
cursor.execute(sql, ["july", "july"])
# 涉及寫操作注意要提交
conn.commit()
# 關閉連接
cursor.close ()
conn.close ()

查詢數據
fetch數據
import pymysql
conn = pymysql.connect (
host='192.168.0.103',
port=3306,
user='root',
password='123',
database='xing',
charset='utf8'
)
# 獲取一個光標
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 返回字典數據類型
# 定義將要執行的sql語句
sql = 'select user,pwd from userinfo;'
# 拼接並執行sql語句
cursor.execute(sql)
# 取到查詢結果
ret1 = cursor.fetchone() # 取一條
ret2 = cursor.fetchmany(3) # 取三條
ret3 = cursor.fetchone() # 取一條
cursor.close()
conn.close()
print(ret1)
print(ret2)
print(ret3)
# 可以獲取指定數量的數據 cursor.fetchmany(3) # 光標按絕對位置移動1 cursor.scroll(1, mode="absolute") # 光標按照相對位置(當前位置)移動1 cursor.scroll(1, mode="relative")

數據回滾
import pymysql
# 建立連接
conn = pymysql.connect(
host="192.168.0.103",
port=3306,
user="root",
password="123",
database="xing",
charset="utf8"
)
# 獲取一個光標
cursor = conn.cursor()
# 定義將要執行的SQL語句
sql1 = "insert into userinfo (user, pwd) values (%s, %s);"
sql2 = "insert into hobby (id, hobby) values (%s,%s);"
user = "july1"
pwd = "july1"
id = "我是錯誤的id" #id = "3"
hobby = "打游戲"
try:
# 拼接並執行SQL語句
cursor.execute(sql1, [user, pwd])
print(sql1)
cursor.execute(sql2, [id, hobby]) # 報錯的SQL語句
# 涉及寫操作注意要提交
conn.commit()
except Exception as e:
print(str(e))
# 有異常就回滾
conn.rollback()
# 關閉連接
cursor.close()
conn.close()

