python連接mysql數據庫(pymsql)


Python連接mysql數據庫

pymsql介紹

PyMySQL 是在 Python3.x 版本中用於連接 MySQL 服務器的一個庫,Python2中則使用mysqldb。

Django中也可以使用PyMySQL連接MySQL數據庫。

pymsql安裝

pip install pymysql

 

登陸驗證中,之前學習的都是建立一個文件,通過把用戶信息保存在這個文件中,然后一行一行的去讀,做校驗

簡單的登陸驗證代碼
# 獲取用戶輸入
name=input('用戶名:')
pwd=input('密碼:')
# 校驗用戶輸入的用戶名和密碼是否正確
with open("userinfo.txt") as f:
    for line in f:
        # 按照空格去分隔每一行,把值分別賦值給name_tmp和pwd_tmp
        name_tmp,pwd_tmp=line.strip().split(" ")
        # 如果能匹配上用戶的輸入,就表示登陸成功
        if name_tmp ==name and pwd_tmp==pwd:
            print("登陸成功")
            break
    else:
        print('登錄失敗')

 

上面的代碼是通過文件操作來完成登陸驗證的,但是有一個問題是每次都要一行一行的去讀,而不能像使用數據庫那樣可以通過索引去找到要驗證一條信息

下面引出通過pymsql讓Python代碼與mysql數據庫建立連接

pymsql的使用

使用方法

# 導入pymysql模塊
import pymysql
# 連接database
conn = pymysql.connect(host=“你的數據庫地址”, user=“用戶名”,password=“密碼”,database=“數據庫名”,charset=“utf8”)
# 得到一個可以執行SQL語句的光標對象
cursor = conn.cursor()
# 定義要執行的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;
"""
# 執行SQL語句
cursor.execute(sql)
# 關閉光標對象
cursor.close()
# 關閉數據庫連接
conn.close()
View Code

 

import pymysql
# 校驗 用戶輸入的用戶名和密碼是否正確
# 去數據庫里取數據做判斷
# 1.連上數據庫,獲得的conn是連接
conn = pymysql.connect(host="localhost",database="s8",user="root",password="123456",charset="utf8")
# 只有連接還不行,還需要獲取光標,讓我能夠輸入sql語句並執行
cursor=conn.cursor()    #cursor是光標
# 2.執行sql語句
sql="select * from userinfo where id>3;"    #要執行的sql語句寫出來
ret = cursor.execute(sql)   #execute是執行的意思,執行sql語句
# 3.關閉光標和連接
cursor.close()
conn.close()

print("%s row in set (0.00 sec)" % ret)

'''
在這個例題中,mysql相當於是serversocket端,pycharm是客戶端
客戶端需要先於服務端建立連接,也就是本例題中的第1步
建立好連接后需要建立通信,也就是第2步,把我要執行的sql給執行了,並把
執行結果返回給變量ret,並保存在變量中
通信結束后需要斷開連接,但在本例題中也獲得了光標,需要把光標也關閉
'''
例題

 

sql注入問題

import pymysql
name=input('用戶名:')
pwd=input('密碼:')
# 校驗用戶輸入的用戶名和密碼是否正確
# 去數據庫里取數據做判斷
# 1.連接上數據庫
conn=pymysql.connect(host='localhost',database='s8',user='root',password='123456',charset='utf8')
# 2.獲取光標
cursor=conn.cursor()
# 3.寫出要執行的sql語句
sql="select * from userinfo where name= '%s' and pwd='%s';" % (name,pwd)
print(sql)
# 4.執行sql
ret = cursor.execute(sql) #獲取影響的行數
# 5.關閉光標和連接
cursor.close()
conn.close()
if ret:
    print('登陸成功')
else:
    print('登陸失敗')

'''
這個例子會出現一個問題就是sql注入
就是當用戶名上輸入alex' or 1=1 -- hehehe,密碼不輸入也會登陸成功
當我正常輸入用戶名和密碼的時候是可以正常判斷執行的
當我在用戶名上輸入alex'or 1=1 --hehe時,實際在mysql數據庫中的顯示的sql
語句是select * from userinfo where name= 'alex' or 1=1 -- hehe' and pwd='';
1=1為真 --在mysql中是注釋,所以這個sql語句會被當做select * from userinfo where name= 'alex' or 1=1去執行,所以,在沒有輸入密碼的情況下就可以顯示登陸成功,這就是sql注入
'''
View Code

 

解決sql注入問題

# 原來是我們對sql進行字符串拼接
# sql="select * from userinfo where name='%s' and password='%s'" %(user,pwd)
# print(sql)
# res=cursor.execute(sql)

#改寫為(execute幫我們做字符串拼接,我們無需且一定不能再為%s加引號了)
sql="select * from userinfo where name=%s and password=%s" #!!!注意%s需要去掉引號,因為pymysql會自動為我們加上
res=cursor.execute(sql,[user,pwd]) #pymysql模塊自動幫我們解決sql注入的問題,只要我們按照pymysql的規矩來。

 

import pymysql
# 獲取用戶輸入
name= input('用戶名:')
pwd =input('密碼:')
# 校驗用戶輸入的用戶名和密碼是否正確
# 去數據庫里取數據做判斷
# 1.連接上數據庫
conn=pymysql.connect(host='localhost',database='s8',user='root',password='123456',charset='utf8')
# 2.獲取光標
cursor=conn.cursor()
# 3.要執行的sql語句
sql="select * from userinfo where name='%s' and pwd='%s';"%(name,pwd)
print(sql)
# 4.讓pymysql拼接字符串
ret=cursor.execute(sql,[name,pwd])  #獲取影響的行數 這里也可以寫成ret=cursor.execute(sql,(name,pwd))
# 5.關閉光標和連接
cursor.close()
conn.close()
if ret:
    print('登陸成功')
else:
    print('登陸失敗')


'''
第四步中execute中寫上要執行的sql語句,要判斷的字段,pymsql會自動的去判斷輸入的信息,
這樣就避免了sql注入的問題
'''
View Code

 

通過pymsq增加數據庫中的數據

import pymysql
# 連接
conn=pymysql.connect(host="localhost",user='root',password="123456",charset="utf8",database="s8")
# 獲取光標
cursor=conn.cursor()
# 寫sql語句
sql="insert into userinfo (name,pwd) VALUE (%s,%s);"
username='egon2'
password='dashabi'

try:
    # 執行sql語句
    cursor.execute(sql,(username,password))
    conn.commit()   #把修改的數據提交到數據庫
except Exception as e:
    conn.rollback() #捕捉到錯誤就回滾

cursor.close()
conn.close()
View Code

 

通過pymsql刪除數據庫中的數據

import pymysql
# 連接
conn=pymysql.connect(host="localhost",database="s8",user="root",password="123456",charset="utf8")
# 獲取光標
cursor=conn.cursor()
# 寫sql語句
sql="delete from userinfo where name=%s;"
username='egon2'
try:
    # 執行sql語句
    cursor.execute(sql,(username,))
    conn.commit()   #把修改提交到數據庫
except Exception as e:
    conn.rollback()

cursor.close()
conn.close()
View Code

 

通過pymsql修改數據庫中的數據

import pymysql
# 連接
username=input('用戶名')
conn = pymysql.connect(host="localhost", user="root", password="root1234", database="s8", charset="utf8")  # 沒有-
# 獲取光標
cursor=conn.cursor()
# 寫sql語句
sql="update userinfo set pwd=%s where name=%s"
print(sql)

ret=cursor.execute(sql,(username,))
print(ret)
# try:
#     # 執行sql語句
#     cursor.execute(sql,(password,username))
#     conn.commit()   #把修改提交到數據庫
# except Exception as e:
#     conn.rollback()
#     print('沒有')
cursor.close()
conn.close()
View Code

 

通過pymsql查詢數據庫中的數據

import pymysql

# 連接
conn = pymysql.connect(host="localhost", user="root", password="123456", database="s8", charset="utf8")  # 沒有-
# 獲取光標
cursor = conn.cursor()
# 寫sql語句
sql = "select * from userinfo;"
# 執行sql語句
ret=cursor.execute(sql)
print('-->',ret)

# 一次取一條
print(cursor.fetchone())
print(cursor.fetchone())
print(cursor.fetchone())

# 一次取所有
# print(cursor.fetchall())

# 自定義取出多少條
# print(cursor.fetchmany(3))

# 進階用法
print(cursor.fetchone())
print(cursor.fetchall())
print(cursor.fetchone())    #如果取不到會返回None

# 移動取數據的光標
cursor.scroll(-2)   #默認是相對移動
print(cursor.fetchone())

# 按照絕對位置去移動
cursor.scroll(4,mode='absolute')
print(cursor.fetchone())

cursor.close()
conn.close()
View Code

 

通過pymsql批量操作數據庫中的數據

import pymysql
# 連接
conn=pymysql.connect(host='localhost',database='s8',user='root',password='123456',charset='utf8')
# 獲取光標
cursor=conn.cursor()
# 寫sql語句
sql="insert into userinfo(name,pwd) values(%s,%s);"
user1='dww1'
pwd1='123456'
user2='dww2'
pwd2='123456'
# 把所有要插入的信息保存在元祖或列表中
data=((user1,pwd1),(user2,pwd2))
try:
    # 執行sql語句
    cursor.executemany(sql,data)    #使用executemany做批量處理
    conn.commit()   #把修改提交到數據庫
except Exception as e :
    conn.rollback()
cursor.close()
conn.close()
View Code

 

獲取插入數據的ID(關聯操作時會用到)

import pymysql
# 連接
conn=pymysql.connect(host="localhost",user='root',password='123456',database='s8',charset='utf8')
# 獲取光標
cursor=conn.cursor()
# 寫sql語句
sql="insert into userinfo(name,pwd) values(%s,%s);"
user1='dww'
pwd1='111111'
try:
    # 執行sql語句
    cursor.execute(sql,(user1,pwd1))
    conn.commit()   #把修改提交到數據庫
    # 拿到我插入的這條數據的id
    last_id=cursor.lastrowid
    print('--->剛才插入的那條數據的id值是:',last_id)
except Exception as e:
    conn.rollback()
cursor.close()
conn.close()
View Code

插入數據失敗回滾

# 導入pymysql模塊
import pymysql
# 連接database
conn = pymysql.connect(host=“你的數據庫地址”, user=“用戶名”,password=“密碼”,database=“數據庫名”,charset=“utf8”)
# 得到一個可以執行SQL語句的光標對象
cursor = conn.cursor()
sql = "INSERT INTO USER1(name, age) VALUES (%s, %s);"
username = "Alex"
age = 18
try:
    # 執行SQL語句
    cursor.execute(sql, [username, age])
    # 提交事務
    conn.commit()
except Exception as e:
    # 有異常,回滾事務
    conn.rollback()
cursor.close()
conn.close()
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM