數據庫之Python操做MySQL

1、引言

  Python操做MySQL一共有兩種方式,第一種是用原生模塊pymysql和mysqldb,這兩種模塊在py2中都支持,可是在py3中只支持pymysql,可是pymysql能夠經過pymysql.install_as_MySQLdb()的方式構形成和mysqldb同樣的使用;第二種方式是ORM框架 SQLAchemy。mysql

2、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注入的狀況。sql

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成立,這樣就會出現即便沒有這個用戶也會登陸成功。數據庫

相關文章
相關標籤/搜索