## 一、引言
Python操作MySQL一共有兩種方式,第一種是用原生模塊pymysql和mysqldb,這兩種模塊在py2中都支持,但是在py3中只支持pymysql,但是pymysql可以通過pymysql.install\_as\_MySQLdb()的方式構造成和mysqldb一樣的使用;第二種方式是ORM框架 SQLAchemy。
## 二、pymysql
### 下載安裝
~~~
pip install pymysql
~~~
### 增、刪、改
~~~
import pymysql
# 增,刪,改除了sql語句不同,使用的方式一致
conn = pymysql.connect(host="localhost",user='root',password='',database="db2") #連接mysql
cursor = conn.cursor() #創建游標
sql = "insert into userinfo(username,password) values(%s,%s)" #sql語句
~~~
~~~
#r表示執行這條語句受影響的行數
r = cursor.execute(sql ,['wusir','123'])
#r = cursor.executemany(sql ,[('jack','213'),('tom','234')]) #表示插入多條數據,只有在插入數據的時候才使用executemany
~~~
~~~
conn.commit() #增刪改執行一定要加conn.commit()
cursor.close() #關閉游標
conn.close() #關閉連接
~~~
### 查
~~~
# 查
conn = pymysql.connect(host="localhost",user='root',password='',database="db2")
# cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) #使用這種游標查出來的數據是列表套子典
cursor = conn.cursor() #使用這種游標查出來的數據是元祖套元祖
sql = "select * from userinfo"
cursor.execute(sql)
#cursor.scroll(1,mode='relative') # 讓游標相對當前位置移動
#cursor.scroll(2,mode='absolute') # 讓游標相對絕對位置移動
#result = cursor.fetchone() # 取一個數據
#print(result)
#result = cursor.fetchmany(4) #取指定數目的數據
#print(result)
result = cursor.fetchall() #取查出來的所有數據
print(result)
cursor.close()
conn.close()
#PS:每取一個數據游標就會向下移動一位
# 新插入數據的自增ID: cursor.lastrowid
# 如當有一個主從表時,從表要根據主表的id變化來插入數據,這時可以使用cursor.lastrowid來獲取最新插入的主表id。
~~~
### 避免mysql注入
寫一個很簡單的基于mysql的登錄程序,數據庫里面只有一個user為alex,pwd為123,當使用第一種寫法時會出現mysql注入的情況。
~~~
import pymysql
user = input('>>請輸入用戶名:')
pwd = input('>>請輸入密碼:')
conn = pymysql.connect(host='127.0.0.1',user='root',password='',database='db2')
cursor = conn.cursor()
#第一種寫法(不可以)
sql = "select * from userinfo where name='%s' and pwd='%s'"%(user,pwd)
cursor.execute(sql)
res = cursor.fetchone()
print(res)
#第二種寫法(可以)
sql = "select * from userinfo where name=%s and pwd=%s"
cursor.execute(sql,[user,pwd])
res = cursor.fetchone()
print(res)
~~~
~~~
#第三種寫法(可以)
sql = "select * from userinfo where name=%(u)s and pwd=%(p)s"
cursor.execute(sql,{'u':user,'p':pwd})
res = cursor.fetchone()
print(res)
~~~
~~~
if res:
print('登陸成功')
else:
print('登陸失敗')
~~~

這就是mysql注入,因為mysql中的注釋是--,使用這種字符串拼接會將后面的語句注釋掉,同時1=1成立,這樣就會出現即使沒有這個用戶也會登錄成功。
- Python學習
- Python基礎
- Python初識
- 列表生成式,生成器,可迭代對象,迭代器詳解
- Python面向對象
- Python中的單例模式
- Python變量作用域、LEGB、閉包
- Python異常處理
- Python操作正則
- Python中的賦值與深淺拷貝
- Python自定義CLI三方庫
- Python并發編程
- Python之進程
- Python之線程
- Python之協程
- Python并發編程與IO模型
- Python網絡編程
- Python之socket網絡編程
- Django學習
- 反向解析
- Cookie和Session操作
- 文件上傳
- 緩存的配置和使用
- 信號
- FBV&&CBV&&中間件
- Django補充
- 用戶認證
- 分頁
- 自定義搜索組件
- Celery
- 搭建sentry平臺監控
- DRF學習
- drf概述
- Flask學習
- 項目拆分
- 三方模塊使用
- 爬蟲學習
- Http和Https區別
- 請求相關庫
- 解析相關庫
- 常見面試題
- 面試題
- 面試題解析
- 網絡原理
- 計算機網絡知識簡單介紹
- 詳解TCP三次握手、四次揮手及11種狀態
- 消息隊列和數據庫
- 消息隊列之RabbitMQ
- 數據庫之Redis
- 數據庫之初識MySQL
- 數據庫之MySQL進階
- 數據庫之MySQL補充
- 數據庫之Python操作MySQL
- Kafka常用命令
- Linux學習
- Linux基礎命令
- Git
- Git介紹
- Git基本配置及理論
- Git常用命令
- Docker
- Docker基本使用
- Docker常用命令
- Docker容器數據卷
- Dockerfile
- Docker網絡原理
- docker-compose
- Docker Swarm
- HTML
- CSS
- JS
- VUE