Python下pymysql模組的使用
目錄
pymysql模組用於在Python程式中操作資料庫.
該模組本質是一個套接字客戶端軟體.
Windows安裝命令:pip3 install pymysql
基本使用:
# 準備資料庫、資料和遠端使用者:
mysql> select * from blog.userinfo;
+----+------+-----+
| id | name | pwd |
+----+------+-----+
| 1 | zyk | ___ |
+----+------+-----+
1 row in set (0.00 sec)
mysql> show grants for 'zyk'@'%';
+------------------------------------------+
| Grants for [email protected]% |
+------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'zyk'@'%' |
+------------------------------------------+
1 row in set (0.00 sec)
# 實現:使用Python程式實現使用者登陸,如果使用者存在則登陸成功 import pymysql user, pwd = input('user:'), input('pwd:') # 1. 連線資料庫 conn = pymysql.connect( host='127.0.0.1', port=3306, user='zyk', password='
[email protected]', db='blog', # 要連線的資料庫名稱 charset='utf8' # 要連線的資料庫編碼 ) # 2. 建立遊標 cursor = conn.cursor() # 3. 執行sql語句 sql = "select name,pwd from userinfo where name='%s' and pwd='%s'" % (user, pwd) result = cursor.execute(sql) # 返回sql查詢成功的記錄數目(查到一條資料後便停止查詢) # print(result) # 即:成功返回1,否則0 # 4. 關閉 cursor.close() # 關閉遊標 conn.close() # 關閉連線 print('log in successfully!') if result else print('logon failure!')
execute()之sql注入
使用者存在,繞過密碼
利用sql語句中的註釋(--),註釋掉密碼的部分.
import pymysql
user, pwd = input('user:'), input('pwd:')
# 1. 連線資料庫
conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='zyk',
password='[email protected]',
db='blog', # 要連線的資料庫名稱
charset='utf8' # 要連線的資料庫編碼
)
# 2. 建立遊標
cursor = conn.cursor()
# 3. 執行sql語句
# sql = "select name,pwd from userinfo where name='%s' and pwd='%s'" % (user, pwd)
# 使用者存在,繞過密碼
sql = "select name,pwd from userinfo where name='%s' -- abc' and pwd='%s'" % (user, pwd) # 注意:--後面要有一個空格,'abc'為任意字元,後面還要加個單引號
print(sql)
result = cursor.execute(sql) # 返回sql查詢成功的記錄數目
# print(result) # 即:成功返回1,否則0
# 4. 關閉
cursor.close() # 關閉遊標
conn.close() # 關閉連線
print('log in successfully!') if result else print('logon failure!')
"""
程式碼輸出如下:
user:zyk
pwd:
select name,pwd from userinfo where name='zyk' -- abc' and pwd=''
log in successfully!
"""
可見,我們只輸入了使用者名稱,並沒有輸入密碼(密碼被註釋掉了),依然顯示登陸成功.
使用者不存在,繞過使用者與密碼
利用or語法,新增一條結果為True的語句,並註釋掉密碼的部分.
import pymysql
user, pwd = input('user:'), input('pwd:')
# 1. 連線資料庫
conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='zyk',
password='[email protected]',
db='blog', # 要連線的資料庫名稱
charset='utf8' # 要連線的資料庫編碼
)
# 2. 建立遊標
cursor = conn.cursor()
# 3. 執行sql語句
# sql = "select name,pwd from userinfo where name='%s' and pwd='%s'" % (user, pwd)
# 使用者不存在,繞過使用者與密碼
sql = "select name,pwd from userinfo where name='%s' or 1=1 -- abc' and pwd='%s'" % (user, pwd)
print(sql)
result = cursor.execute(sql) # 返回sql查詢成功的記錄數目
# print(result) # 即:成功返回1,否則0
# 4. 關閉
cursor.close() # 關閉遊標
conn.close() # 關閉連線
print('log in successfully!') if result else print('logon failure!')
"""
程式碼輸出如下:
user:
pwd:
select name,pwd from userinfo where name='' or 1=1 -- abc' and pwd=''
log in successfully!
"""
可見,我們併為輸入使用者名稱和密碼,依然顯示登陸成功.
解決sql注入問題
pymysql模組自帶解決sql注入的問題,只要我們按照pymysql模組的規定就行.
import pymysql
user, pwd = input('user:'), input('pwd:')
# 1. 連線資料庫
conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='zyk',
password='[email protected]',
db='blog', # 要連線的資料庫名稱
charset='utf8' # 要連線的資料庫編碼
)
# 2. 建立遊標
cursor = conn.cursor()
# 3. 執行sql語句
# sql = "select name,pwd from userinfo where name='%s' and pwd='%s'" % (user, pwd)
# result = cursor.execute(sql) # 返回sql查詢成功的記錄數目
# print(result) # 即:成功返回1,否則0
# 改寫為(execute幫我們拼接字串,我們無需且一定不能再為%s加引號)
sql = 'select name,pwd from userinfo where name=%s and pwd=%s'
# 改寫為(用agrs引數傳入使用者名稱及密碼)
result = cursor.execute(sql, [user, pwd])
# 4. 關閉
cursor.close() # 關閉遊標
conn.close() # 關閉連線
print('log in successfully!') if result else print('logon failure!')
execute的arges引數可以接受list、tuple或dict:
如果args是一個列表或元組,%s可以用作查詢中的佔位符。
如果args是一個dict, %(name)s可以用作查詢中的佔位符。
# arges引數為dict時的寫法:
sql = 'select name,pwd from userinfo where name=%(name)s and pwd=%(pwd)s'
result = cursor.execute(sql, {'name': user, 'pwd': pwd})
commit()
在資料庫裡增、刪、改,只是在記憶體中操作,所以必須要進行提交,否則插入的資料不但不會生效,還會影響到自增id等.
增
import pymysql
user, pwd = input('user:'), input('pwd:')
conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='zyk',
password='[email protected]',
db='blog', # 要連線的資料庫名稱
charset='utf8' # 要連線的資料庫編碼
)
# 建立遊標
cursor = conn.cursor()
# 增
sql = 'insert into userinfo(name, pwd) values (%s, %s)'
effect_row = cursor.execute(sql,(user, pwd))
print(effect_row) # 返回增加的記錄數
# 同時插入多條資料:executemany()
# effect_row = cursor.executemany(sql, [("張三", '123'), ("李四", '456')])
# 一定要記得提交
conn.commit()
# 關閉
cursor.close()
conn.close()
改
import pymysql
new_name = input('>>> ')
conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='zyk',
password='[email protected]',
db='blog', # 要連線的資料庫名稱
charset='utf8' # 要連線的資料庫編碼
)
# 建立遊標
cursor = conn.cursor()
# 改
sql = "update userinfo set name=%s where name='zyk'"
effect_row = cursor.execute(sql, new_name)
print(effect_row) # 返回修改的記錄數
# 一定要記得提交
conn.commit()
# 關閉
cursor.close()
conn.close()
刪
import pymysql
conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='zyk',
password='[email protected]',
db='blog', # 要連線的資料庫名稱
charset='utf8' # 要連線的資料庫編碼
)
cursor = conn.cursor()
# 刪
sql = "delete from userinfo where name='張三' or name='李四'" # 同時刪除多條記錄
effect_row = cursor.execute(sql)
print(effect_row) # 返回刪除的記錄數
# 一定要記得提交
conn.commit()
# 關閉
cursor.close()
conn.close()
查詢資料庫
- fetchone() # 獲取下一行資料,第一次為首行
- fetchall() # 獲取所有行資料
- fetchmany(4) # 獲取4行數
表內容如下:
fetchone()
import pymysql
# 連線資料庫
conn = pymysql.connect(
host='localhost',
port=3306,
user='zyk',
password='[email protected]',
db='blog',
charset='utf8'
)
# 建立遊標
cursor = conn.cursor()
# 執行sql語句
sql = 'select * from userinfo'
cursor.execute(sql)
# 查詢第一行資料
row = cursor.fetchone()
print(row)
# 查詢第二行資料
row = cursor.fetchone()
print(row)
# 關閉
cursor.close()
conn.close()
"""
輸出:
(1, 'zyk', '___')
(2, '張三', '123')
"""
如上:在獲取行資料的時候,可以理解為開始。有一個行指標指向第一行,獲取一行,他就向下移動一行。所以當行指標移動到最後一行時,便無法在獲取到資料了(None)。此時我們可以使用如下方法來移動行指標:
- cursor.scroll(1, mode='relative') # 相對當前位置移動
- cursor.scroll(2, mode='absolute') # 相對絕對位置移動
值1為移動的行數,relative:可指定負數(向上移動);adsolute:0為第一行;
mode指定的是相對於當前行移動還是相對於首行移動.
fetchall()
import pymysql
# 連線資料庫
conn = pymysql.connect(
host='localhost',
port=3306,
user='zyk',
password='[email protected]',
db='blog',
charset='utf8'
)
# 建立遊標
cursor = conn.cursor()
# 執行sql語句
sql = 'select * from userinfo'
cursor.execute(sql)
# 獲取所有資料
rows = cursor.fetchall()
print(rows)
# 關閉
cursor.close()
conn.close()
"""
輸出:
((1, 'zyk', '___'), (2, '張三', '123'), (3, '李四', '456'))
"""
預設情況下,我們獲取到的返回值是元組,可使用以下方式來返回字典:
# 在例項化時,將屬性cursor設定為:
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
fetchmany()
import pymysql
# 連線資料庫
conn = pymysql.connect(
host='localhost',
port=3306,
user='zyk',
password='[email protected]',
db='blog',
charset='utf8'
)
# 建立遊標
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 執行sql語句
sql = 'select * from userinfo'
cursor.execute(sql)
# 獲取2條資料
rows = cursor.fetchmany(2)
print(rows)
# 如果此時想要再獲取已經獲取過的資料,就需要移動行指標
cursor.scroll(0, mode='absolute') # 移動到第一行
rows = cursor.fetchall()
print(rows)
# 關閉
cursor.close()
conn.close()
"""
輸出:
[{'id': 1, 'name': 'zyk', 'pwd': '___'}, {'id': 2, 'name': '張三', 'pwd': '123'}]
[{'id': 1, 'name': 'zyk', 'pwd': '___'}, {'id': 2, 'name': '張三', 'pwd': '123'}, {'id': 3, 'name': '李四', 'pwd': '456'}]
"""
人生中不可避免的定律
定律一:財富定律
勤勞不一定能夠致富,但懶惰一定不能致富.
定律二:忙碌定律
人可以為了自己的夢想而去忙碌,但不能因為你忙碌而失去夢想.
定律三:擔心定律
你越是擔心的事情越有可能發生.
定律四:執著定律
任何的事情都不可過分執著,無論是風光還是難堪這些都會過去.
定律五:堵住定律
有很多越是輸不起的人,越是喜歡下大賭注.
定律六:目標定律
目標太多,最後只會是失去目標,知道自己想要什麼的人,能比都想要的人更容易成功.
定律七:方向定律
如果一個人不知道自己要嚮往哪個碼頭,那麼不管什麼風都不會是順風.
定律八:誘惑定律
凡是抵擋不住誘惑的人,十之八九是沒有經歷過誘惑的人,這與誘惑大小無關.
定律九:時間定律
時間就是生命,對於男人來說是積累,對於女人來說是消耗.
年輕本無價,一身碌碌無為
讓無價變為了低價,你應該珍惜自己的機會.
相關推薦
Python下pymysql模組的使用
目錄 增 改 刪 查詢資料庫 pymysql模組用於在Python程式中操作資料庫. 該模組本質是一個套接字客戶端軟體. Windows安裝命令:pip3 in
Python使用PyMysql模組報錯:lock wait timeout exceeded; try restarting transactio
呵呵,我只想說:關於這個問題我整了兩個星期,關於這個問題的原因,從網上看到的很多文章全都是說要conn.commit(), 但是我在程式裡面已經commit()了,最後定位到的問題是Pymysql在多執行緒(或多程序下)面會有bug,對,你沒聽錯, Pymysql模組自身的bug造成的:
關於Python下安裝模組
我們在做自動化測試過程中,需要依賴很多模組幫助我們完成某些功能,比如說openpyxl可以實現exce表格的讀寫 模組安裝的方式 模組安裝方式分為兩種:線上安裝與離線安裝 1. 離線安裝 https://pypi.org/project 1)&nb
【Python】 pymysql模組處理Mysql資料庫
PyMySQL 是在 Python3.x 版本中用於連線 MySQL 伺服器的一個庫,Python2中則使用mysqldb。 PyMySQL 遵循 Python 資料庫 API v2.0 規範,幷包含了 pure-Python MySQL 客戶端庫。 在使用 PyMySQL 之前,我們需要確保
Python操作MySQL:pymysql模組
連線MySQL有兩個模組:mysqldb和pymysql,第一個在Python3.x上不能用,所以我們學pymysql import pymysql # 建立連線 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', pas
python中lxml模組下的xpath用法
安裝 pypi下載地址:https://pypi.python.org/pypi/lxml/3.4.2#downloads pip install lxml XPath 是一門在 XML 文件中查詢資訊的語言。XPath 可用來在 XML 文件中對元素和屬
python中匯入其他目錄下的模組 ——轉載
python包含子目錄中的模組方法比較簡單,關鍵是能夠在sys.path裡面找到通向模組檔案的路徑。 下面將具體介紹幾種常用情況: 1. 主程式與模組程式在同一目錄下: 如下面程式結構: `-- src |-- mod1.py &nbs
win10環境下Python安裝skimage模組
個人Python環境為Anaconda自帶python3.6,使用Anaconda Prompt安裝時出錯,效果如下,不能安裝skimage庫: 因此,安裝skimage模組需要另一種方式。 1.下載安裝包 在https://www.lfd.uci.edu/~gohlke/pyth
python下使用scrapy-redis模組分散式爬蟲的爬蟲專案部署詳細教程————————gerapy
1.使用gerapy進行分散式爬蟲管理 準備工作: 首先將你使用scrapy-redis寫的分散式爬蟲全部完善 模組準備: 安裝: pip install pymongo【依賴模組】 pip install gerapy 2.在本地建立部署專案的資料夾
Win10下為Python安裝Graphviz模組
設定環境變數 一是設定使用者環境,即增加D:\jupyter_notebook\graphviz-2.38\bin,如下: 二是設定系統變數,即增加D:\jupyter_notebook\graphviz-2.38\bin\dot.exe,如下: 檢測環境變數是否生效: 1.開啟dos視窗:w
Python下關於RSA解密模組的使用
最近籌備一場CTF比賽發現了一道關於RSA解密的題如下: #小明得到了一個 RSA 加密資訊,你能幫他解開嗎? n = 41069065654959614597750207738698085798765257876378561837894254544512565197793
Python下使用Psyco模組優化執行速度
今天介紹下Psyco模組,Psyco模組可以使你的Python程式執行的像C語言一樣快。都說Python語言易用易學,但效能上跟一些編譯語言(如C語言)比較要差不少,這裡可以用C語言和Python語言各編寫斐波納契數列計算程式,並計算執行時間: C語言程式 複製程式碼程式碼如下: int
python中 math模組下 atan 和 atan2的區別
atan 和 atan2 都是反正切函式,返回的都是弧度 對於兩點形成的直線,兩點分別是 point(x1,y1) 和 point(x2,y2),其斜率對應角度的計算方法可以是: angle = atan( (y2-y1)/(x2-x1) ) 或 ang
強化學習 平臺 openAI 的 gym 安裝 (Ubuntu環境下如何安裝Python的gym模組)
openAI 公司給出了一個整合較多環境的強化學習平臺 gym , 本篇部落格主要是講它怎麼安裝。 openAI公司的主頁: https://www.openai.com/systems/ 從主頁上我們可以看到openAI 公司其實給出了多個強化學習的平臺
python下使用pip freeze >requirements.txt命令遷移模組
當我們開發專案的時候,會用virtualenv建立 很多python獨立環境, 這時候就會出現在不同環境下安裝相同的模組的時候, 為了避免我們通過聯網下載所需模組, 不如我們直接從之前pytho
python資料庫操作之pymysql模組和sqlalchemy模組(專案必備)
pymysql pymsql是Python中操作MySQL的模組,其使用方法和MySQLdb幾乎相同。 1、下載安裝 pip3 install pymysql 2、操作資料庫 (1)、執行sql #!/usr/bin/env python # -*-
Python下的Mysql模組MySQLdb安裝詳解
[[email protected] MySQL-python-1.2.3]# /usr/local/bin/python2.7 Python 2.7.6 (default, Apr 10 2014, 15:45:39) [GCC 4.4.7 20120313 (Red Hat 4.4.7-4)
ubuntu14.10下解除安裝安裝在python上的模組
在ubuntu14.10下, 在/usr/local/lib/下, 有python2.7, python3.4 [email protected]:/usr/local/lib$ ls python2.7 python3.4 [email protec
linux下python安裝pyzmq模組
一、ZMQ的原始碼安裝 1.下載libzmq的原始碼: git clonehttps://github.com/zeromq/libzmq 2.依次執行如下命令: ./autogen.sh(執
window下python的numpy模組安裝
參考:https://morvanzhou.github.io/tutorials/data-manipulation/np-pd/1-2-install/我下載的是其中黑框標註的,cp35對應 python 版本 python3.5,amd64對應我的window是64位系