Python連接MySQL數據庫


一、PyMySQL安裝

pip install pymysql    # cmd中安裝(命令行操作)

二、連接數據庫

1、基本操作

# 導入pymysql模塊
import pymysql
# 連接database
conn = pymysql.connect(
    host='數據庫ip地址',
    port='端口號',
    user='用戶名',
    password='密碼',
    database='數據庫名',
    charset='utf8'  # 不要用utf-8
)
# 得到一個可以執行SQL語句的光標對象
cursor = conn.cursor()
# 得到一個可以執行SQL語句並且將結果作為字典返回的光標對象
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 定義要執行的SQL語句(創建表結構)
sql = '''
create table userinfo(
id int auto_increment primary key,
username varchar(20) not null unique,
password varchar(20) not null
) engine=innodb default charset=utf8;
'''
# 執行SQL語句
cursor.execute(sql)
# 關閉光標對象
cursor.close()
# 關閉數據庫連接
conn.close()

 

2、SQL注入

  2.1 什么是SQL注入?

    用戶輸入的內容有惡意的SQL語句,后端拿到用戶輸入的內容不做檢測直接做字符串拼接,得到一個和預期不一致的SQL語句

  2.2 如何解決SQL注入?

    對用戶輸入的內容做檢測

    pymysql 模塊內置了這種檢測,我們只需要讓pymysql幫我們拼接SQL語句

    ret = cursor.execute(sql, [name, pwd])  # 讓pymysql 模塊幫我們拼接SQL語句,執行SQL語句

'''
Mysql SQL注入
'''
import pymysql

# 獲取用戶輸入
name = input('請輸入用戶名:')
pwd = input('請輸入密碼:')

# 1.連接數據庫,得到一個連接
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='yang',
    database='day43',
    charset='utf8'
)
# 2.獲取光標
cursor = conn.cursor()
# 3.執行SQL語句
sql = "select * from userinfo where username='%s' and password='%s';" % (name, pwd)
print(sql)
ret = cursor.execute(sql)
# 關閉
cursor.close()
conn.close()
if ret:
    print('登錄成功')
else:
    print('登錄失敗')
'''
如果用戶輸入:(正確的用戶名' -- 然后密碼隨便輸入,也可以成功登錄),因為--表示注釋,相當於把后面的密碼給注釋掉了
或者用戶輸入:(錯誤的用戶名' or 1=1 -- 然后密碼隨便輸入,也可以成功登錄)
所以用普通的字符串拼接是很危險的
'''

# 解決方法:用pymysql幫我們拼接SQL語句
import pymysql

# 獲取用戶輸入
name = input('請輸入用戶名:')
pwd = input('請輸入密碼:')

# 1.連接數據庫,得到一個連接
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='yang',
    database='day43',
    charset='utf8'
)
# 2.獲取光標
cursor = conn.cursor()
# 3.執行SQL語句
sql = "select * from userinfo where username=%s and password=%s;"   # 按照pymysql模塊的寫法定義好占位符
print(sql)
ret = cursor.execute(sql, [name, pwd])  # 讓pymysql模塊幫我們拼接SQL語句,執行sql語句
# 關閉
cursor.close()
conn.close()
if ret:
    print('登錄成功')
else:
    print('登錄失敗')

3、增刪改查操作

  增

'''
向userinfo表插入一條數據
'''
import pymysql

# 1.連接數據庫,得到一個連接
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='yang',
    database='day43',
    charset='utf8'
)
# 2.獲取光標
cursor = conn.cursor()
# 3.執行SQL語句
sql = "insert into userinfo(username, password) values (%s,%s);"cursor.execute(sql, ['石曉', '123'])
# 涉及操作數據庫的,一定要提交
conn.commit()
# 關閉
cursor.close()
conn.close()

 

插入數據失敗回滾

在執行增刪改操作時,如果不想提交前面的操作,可以使用 rollback() 回滾取消操作。

'''
向userinfo表插入一條數據
'''
import pymysql

# 1.連接數據庫,得到一個連接
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='yang',
    database='day43',
    charset='utf8'
)
# 2.獲取光標
cursor = conn.cursor()
# 3.執行SQL語句
sql = "insert into userinfo(username, password) values (%s,%s);"
try:
    cursor.execute(sql, ['石曉', '123'])
    # 涉及操作數據庫的,一定要提交
    conn.commit()
except Exception:
    # 有異常,回滾事務
    conn.rollback()
# 關閉
cursor.close()
conn.close()

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

'''
向userinfo表插入一條數據
'''
import pymysql

# 1.連接數據庫,得到一個連接
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='yang',
    database='day43',
    charset='utf8'
)
# 2.獲取光標
cursor = conn.cursor()
# 3.執行SQL語句
sql = "insert into userinfo(username, password) values (%s,%s);"
try:
    cursor.execute(sql, ['石曉', '123'])
    # 涉及操作數據庫的,一定要提交
    conn.commit()
    # 提交之后,獲取剛插入的數據的ID
    last_id = cursor.lastrowid
except Exception:
    # 有異常,回滾事務
    conn.rollback()
# 關閉
cursor.close()
conn.close()

批量執行

'''
向userinfo表批量插入數據
'''
import pymysql

# 1.連接數據庫,得到一個連接
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='yang',
    database='day43',
    charset='utf8'
)
# 2.獲取光標
cursor = conn.cursor()
# 3.執行SQL語句
sql = "insert into userinfo(username, password) values (%s,%s);"
data = [('何思浩','123'),('王瑞臣','123'),('老王','123')]
try:
    cursor.executemany(sql, data)
    # 涉及操作數據庫的,一定要提交
    conn.commit()
except Exception:
    # 有異常,回滾事務
    conn.rollback()
# 關閉
cursor.close()
conn.close()

  刪

'''
從userinfo表刪掉一條數據
'''
import pymysql

# 1.連接數據庫,得到一個連接
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='yang',
    database='day43',
    charset='utf8'
)
# 2.獲取光標
cursor = conn.cursor()
# 3.執行SQL語句
sql = "delete from userinfo where username=%s;"
cursor.execute(sql, ['alex'])
# 4.提交
conn.commit()
# 5.關閉
cursor.close()
conn.close()

  改

'''
從userinfo把其中一個用戶的密碼改成789
'''
import pymysql

# 1.連接數據庫,得到一個連接
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='yang',
    database='day43',
    charset='utf8'
)
# 2.獲取光標
cursor = conn.cursor()
# 3.執行SQL語句
sql = "update userinfo set password=%s where username=%s"
cursor.execute(sql, ['789', 'taibai'])
# 4.涉及操作數據庫的,一定要提交
conn.commit()
# 5.關閉
cursor.close()
conn.close()

  查

'''
從userinfo查詢數據
'''
import pymysql

# 1.連接數據庫,得到一個連接
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='yang',
    database='day43',
    charset='utf8'
)
# 2.獲取光標
cursor = conn.cursor()
# cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 字典類型

# 3.執行SQL語句
sql = "select * from userinfo;"
cursor.execute(sql)
ret = cursor.fetchall()  # 查看全部數據
print(ret)
ret = cursor.fetchone()  # 查看單條數據
print(ret)
ret = cursor.fetchone()  # 查看單條數據
print(ret)
ret = cursor.fetchmany(3)  # 指定數量查看
print(ret)

# 4.關閉
cursor.close()
conn.close()

   進階用法

# 移動光標位置
cursor.scroll(0, mode='absolute')   # 絕對位置,讓光標移動到哪就到哪
cursor.scroll(-1, mode='relative')  # 相對位置,負數則向前移動,正數向后移動

 


免責聲明!

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



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