1. 程式人生 > >Python下pymysql模組的使用

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'}]
"""

人生中不可避免的定律

定律一:財富定律
勤勞不一定能夠致富,但懶惰一定不能致富.

定律二:忙碌定律
人可以為了自己的夢想而去忙碌,但不能因為你忙碌而失去夢想.

定律三:擔心定律
你越是擔心的事情越有可能發生.

定律四:執著定律
任何的事情都不可過分執著,無論是風光還是難堪這些都會過去.

定律五:堵住定律
有很多越是輸不起的人,越是喜歡下大賭注.

定律六:目標定律
目標太多,最後只會是失去目標,知道自己想要什麼的人,能比都想要的人更容易成功.

定律七:方向定律
如果一個人不知道自己要嚮往哪個碼頭,那麼不管什麼風都不會是順風.

定律八:誘惑定律
凡是抵擋不住誘惑的人,十之八九是沒有經歷過誘惑的人,這與誘惑大小無關.

定律九:時間定律
時間就是生命,對於男人來說是積累,對於女人來說是消耗.

年輕本無價,一身碌碌無為
讓無價變為了低價,你應該珍惜自己的機會.

相關推薦

Pythonpymysql模組的使用

目錄 增 改 刪 查詢資料庫 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

Pythonpymysql模組處理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.在本地建立部署專案的資料夾

Win10Python安裝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

linuxpython安裝pyzmq模組

一、ZMQ的原始碼安裝 1.下載libzmq的原始碼: git clonehttps://github.com/zeromq/libzmq 2.依次執行如下命令: ./autogen.sh(執

windowpython的numpy模組安裝

參考:https://morvanzhou.github.io/tutorials/data-manipulation/np-pd/1-2-install/我下載的是其中黑框標註的,cp35對應 python 版本 python3.5,amd64對應我的window是64位系