PyMySQL

PyMySQL安裝

pip install pymysql

  

鏈接數據庫

在進行本文如下內容以前須要注意:python

  • 你有一個MySQL數據庫,而且已經啓動。
  • 你有能夠鏈接該數據庫的用戶名和密碼
  • 你有一個有權限操做的database

基本使用

# 導入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()
# 導入pymysql模塊
import pymysql # 鏈接database
conn = pymysql.connect(host=「你的數據庫地址」, user=「用戶名」,password=「密碼」,database=「數據庫名」,charset=「utf8」) # 獲得一個能夠執行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; """
# 執行SQL語句
cursor.execute(sql) # 關閉光標對象
cursor.close() # 關閉數據庫鏈接
conn.close()
返回字典格式數據:

注意:mysql

charset=「utf8」,編碼不要寫成"utf-8"sql

  

 

""" 獲取用戶輸入,登陸 """
import pymysql # 1. 獲取用戶輸入
name = input('請輸入用戶名:') pwd = input('請輸入密碼:') # 判斷用戶名和密碼是否正確 # 去數據庫查詢一下 用戶輸入的用戶名和密碼是否正確 # 在Python程序中要鏈接數據庫執行SQL語句 --> pymysql模塊

# 1. 鏈接數據庫,獲得一個鏈接
conn = pymysql.connect( host='127.0.0.1', port=3306, user='root', password='123', database='day43', charset='utf8' ) # 2. 獲取光標
cursor = conn.cursor() # 3. 執行SQL語句 # 3.1 獲得SQL語句
sql = "select * from userinfo where username='%s' and password='%s';" % (name, pwd) print(sql) # 3.2 使用光標對象執行SQL語句
ret = cursor.execute(sql) # 關閉
cursor.close() conn.close() # 4 獲得結果
if ret: print('登錄成功') else: print('登陸失敗')
pymysql登陸示例

SQL注入問題

1. 什麼是SQL注入?
    用戶輸入的內容有惡意的SQL語句,後端拿到用戶輸入的內容不作檢測直接作字符串拼接,獲得一個和預期不一致的SQL語句
2. 如何解決SQL注入?
    對用戶輸入的內容作檢測
    pymysql內置了這種檢測,咱們只須要讓pymysql幫咱們拼接sql語句
    ret = cursor.execute(sql, [name, pwd])  # 讓pymysql模塊幫咱們拼接sql語句,執行SQL語句

  

''' 獲取用戶輸入,登陸 '''

import pymysql name = input('請輸入用戶名:') pwd = input('請輸入密碼:') # 1.鏈接數據庫,獲得一個鏈接
conn = pymysql.connect( host='127.0.0.1', port=3306, user='root', password='123', database='day43', charset='utf8' ) # 2.獲取光標
cursor = conn.cursor() # 3.執行sql語句 # 3.1 獲得sql語句
sql = "select * from userinfo where username=%s and password=%s;"  # 按照pymysql模塊的寫法定義好佔位符
print(sql) # 3.2使用光標對象執行sql語句 # ret = cursor.execute(sql)
ret = cursor.execute(sql, [name, pwd])  # 讓pymsql模塊幫咱們拼接sql語句,執行sql語句 # 關閉
cursor.close() conn.close() # 4.獲得結果
print(ret) if ret: print('登陸成功') else: print('登陸失敗') # with open('userinfo', ) as f: # for line in f: # u,p = line.strip().split() # if u
SQL注入

 

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


# 1. 鏈接數據庫,獲得一個鏈接
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='123',
    database='day43',
    charset='utf8'
)
# 2. 獲取光標
cursor = conn.cursor()
# 3. 執行SQL語句
# 3.1 獲得SQL語句
sql = "insert into userinfo(username, password) values (%s,%s);"  # 按照pymysql模塊的寫法定義好佔位符
# 3.2 使用光標對象執行SQL語句
ret = cursor.execute(sql, ['Eva_J', '456'])  # 讓pymysql模塊幫咱們拼接sql語句,執行SQL語句
# 涉及操做數據庫的 必定要提交
conn.commit()
# 關閉
cursor.close()
conn.close()

  

插入數據失敗回滾數據庫

在執行增刪改操做時,若是不想提交前面的操做,可使用 rollback() 回滾取消操做。後端

# 導入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()

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

# 導入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()
    # 提交以後,獲取剛插入的數據的ID
    last_id = cursor.lastrowid
except Exception as e:
    # 有異常,回滾事務
    conn.rollback()
cursor.close()
conn.close()

  批量執行fetch

# 導入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);"
data = [("Alex", 18), ("Egon", 20), ("Yuan", 21)]
try:
    # 批量執行多條插入SQL語句
    cursor.executemany(sql, data)
    # 提交事務
    conn.commit()
except Exception as e:
    # 有異常,回滾事務
    conn.rollback()
cursor.close()
conn.close()

  

"""
從userinfo表把alex刪掉
"""
import pymysql


# 1. 鏈接數據庫,獲得一個鏈接
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='123',
    database='day43',
    charset='utf8'
)
# 2. 獲取光標
cursor = conn.cursor()
# 3. 執行SQL語句
# 3.1 獲得SQL語句
sql = "delete from userinfo where username=%s;"  # 按照pymysql模塊的寫法定義好佔位符
# 3.2 使用光標對象執行SQL語句
ret = cursor.execute(sql, ['alex'])  # 讓pymysql模塊幫咱們拼接sql語句,執行SQL語句
# 涉及操做數據庫的 必定要提交
conn.commit()
# 關閉
cursor.close()
conn.close()

  

"""
從userinfo表把金老闆的密碼改爲789
"""
import pymysql


# 1. 鏈接數據庫,獲得一個鏈接
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='123',
    database='day43',
    charset='utf8'
)
# 2. 獲取光標
cursor = conn.cursor()
# 3. 執行SQL語句
# 3.1 獲得SQL語句
sql = "update userinfo set password=%s where username=%s;"  # 按照pymysql模塊的寫法定義好佔位符
# 3.2 使用光標對象執行SQL語句
ret = cursor.execute(sql, ['789', 'gold'])  # 讓pymysql模塊幫咱們拼接sql語句,執行SQL語句
# 涉及操做數據庫的 必定要提交
conn.commit()
# 關閉
cursor.close()
conn.close()

  

"""
從userinfo表查詢全部數據
"""
import pymysql


# 1. 鏈接數據庫,獲得一個鏈接
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='123',
    database='day43',
    charset='utf8'
)
# 2. 獲取光標
cursor = conn.cursor()
# 3. 執行SQL語句
# 3.1 獲得SQL語句
sql = "select * from userinfo;"  # 按照pymysql模塊的寫法定義好佔位符
# 3.2 使用光標對象執行SQL語句
cursor.execute(sql)  # 讓pymysql模塊幫咱們拼接sql語句,執行SQL語句
ret = cursor.fetchall()
print(ret)
# 關閉
cursor.close()
conn.close()

 

查(字典類型)

"""
從userinfo表查詢全部數據
"""
import pymysql


# 1. 鏈接數據庫,獲得一個鏈接
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='123',
    database='day43',
    charset='utf8'
)
# 2. 獲取光標
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 3. 執行SQL語句
# 3.1 獲得SQL語句
sql = "select * from userinfo;"  # 按照pymysql模塊的寫法定義好佔位符
# 3.2 使用光標對象執行SQL語句
cursor.execute(sql)  # 讓pymysql模塊幫咱們拼接sql語句,執行SQL語句
# 查詢全部
# ret = cursor.fetchall()
# 查詢單條記錄
# ret = cursor.fetchone()
# print(ret)
# ret = cursor.fetchone()
# print(ret)
# ret = cursor.fetchone()
# print(ret)
# 查詢指定數量的數據
ret = cursor.fetchmany(3)
print(ret)
print(cursor.fetchone())
print(cursor.fetchone())
# cursor.scroll(0, mode='absolute')  # 絕對位置,你讓光標移動到哪裏
# cursor.scroll(-1, mode='relative')  # 相對位置,基於光標當前位置移動
print(cursor.fetchone())
# 關閉
cursor.close()
conn.close()

  

進階用法

# 能夠獲取指定數量的數據
cursor.fetchmany(3)
# 光標按絕對位置移動1
cursor.scroll(1, mode="absolute")
# 光標按照相對位置(當前位置)移動1
cursor.scroll(1, mode="relative")
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息