1. 程式人生 > >Mysql學習---Python操作Mysql 1231

Mysql學習---Python操作Mysql 1231

https cut 進入 無法 rom png -s swd bsp

安裝PyMysql

安裝PyMysql:Py3默認自帶pip3安裝,Py2默認無pip命令

cmd進入PyCharm的安裝目錄完成安裝 pip3 install pymysql

技術分享圖片

安裝完成的位置:E:\PyCharm 2017.2.4\Python3.2.5\Lib\site-packages

技術分享圖片

故障處理:更新一下默認的Python安裝

技術分享圖片

Py下操作Mysql

PyMySQL - 專門用於操作MySQLpython模塊, Py2和Py3同時兼容

- MySQLdb(py3暫時不支持MySQLdb)

基本操作:添加信息——Insert

# -*- coding:utf-8 -*-
import pymysql

# 創建連接
conn = pymysql.connect(host=‘127.0.0.1‘, port=3306, user=‘root‘, passwd=‘‘, db=‘test_python‘, charset=‘utf8‘)
# 創建遊標
cursor = conn.cursor()  # 默認是元組,可以更改為字典類型
# 第一種:直接插入
# 執行SQL,並返回受影響行數
insert_effect_row = cursor.execute("insert into course(cname, teacher_id) VALUES (‘hhhh43hhkkhh‘, ‘2‘)") 
inp = input(‘請輸入姓名:‘)
inp2 = input(‘請輸入教師ID:‘)
# 第二種:字符串拼接
# sql = ‘insert into course(cname) VALUES ("%s")‘ %inp  
# cursor.execute(sql)                 # 字符串拼接可以用,但是容易造成sql註入不推薦使用
# 第三種:參數傳遞,利用%s做占位符號,傳入參數進去,PyMysql內部幫我們轉換
insert_effect_row_sec = cursor.execute("insert into course(cname, teacher_id) VALUES (%s, %s)", (inp, inp2))  # 參數傳遞
# 第四種: 多條信息的插入
li = [
    (‘哇哈哈1‘, 1),
    (‘哇哈哈2‘, 2),
    (‘哇哈哈3‘, 3),
]
executmany = cursor.executemany("insert into course(cname, teacher_id) VALUES (%s, %s)", li) # 傳入可叠代的類型
print(‘executmany:‘, executmany)  # executmany: 3 ,修改成功3條
# 提交,不然無法保存新建或者修改的數據
conn.commit()
# 關閉遊標
cursor.close()
# 關閉連接
conn.close()

技術分享圖片

基本操作:查找信息——Select

# -*- coding:utf-8 -*-
import pymysql
# 創建連接
conn = pymysql.connect(host=‘127.0.0.1‘, port=3306, user=‘root‘, passwd=‘‘, db=‘test_python‘, charset=‘utf8‘)
# 創建遊標
cursor = conn.cursor()
ret = cursor.execute(‘select * from student‘)  # 僅僅數據加載到內存,需要fetch取值
print(ret)  # 查找到結果的數量
# 第一種: 直接打印,數據量大的時候容易導致內存不夠用(內部有一個指針索引)
# r = cursor.fetchall()
# print(‘取出所有值\n‘, r)  # 打印結果,結果是一個元組
# 第二種: 從內存中取出來1條數據,此時數據已經加載到內存
r1 = cursor.fetchone()
print(‘拿出一個\n:‘, r1)
# 第三種: 從內存中取出來3條數據,此時數據已經加載到內存
r3 = cursor.fetchmany(3)
print(‘拿出三個\n:‘, r3)
# 第四種:操作指針取出數據
# cursor.scroll(0, mode=‘relative‘)  # 相對位置,指針索引回歸0, +1/-1 分別表示向上/向下
# r4 = cursor.fetchmany(3)
# print(‘相對索引拿出三個\n:‘, r4)   # 從第5個開始取值 : ((5, ‘女‘, 1, ‘張二‘), (6, ‘男‘, 1, ‘張四‘), (7, ‘女‘, 2, ‘鐵錘‘))
cursor.scroll(0, mode=‘absolute‘)    # 絕對位置,指針索引回歸0
r5 = cursor.fetchmany(3)
print(‘絕對索引拿出三個\n:‘, r5)     # 從第0個位置開始取值: ((1, ‘男‘, 1, ‘理解‘), (2, ‘女‘, 1, ‘鋼蛋‘), (3, ‘男‘, 1, ‘張三‘))
# 關閉遊標
cursor.close()
# 關閉連接
conn.close()

技術分享圖片

基本操作:更改信息——Update

# -*- coding:utf-8 -*-
import pymysql

# 創建連接
conn = pymysql.connect(host=‘127.0.0.1‘, port=3306, user=‘root‘, passwd=‘‘, db=‘test_python‘, charset=‘utf8‘)
# 創建遊標
cursor = conn.cursor()
inp  = input(‘請輸入更新後的信息:‘)
ret  = cursor.execute("update course set cname = %s where cname = ‘哇哈哈4‘", inp)
ret2 = cursor.execute("update course set cname = %s where cname = ‘哇哈哈1‘", inp)
# 提交,不然無法保存新建或者修改的數據
conn.commit()
print(‘不存在且更新結果:‘, ret, ‘\r\n存在且更新結果:‘, ret2)
# 關閉遊標
cursor.close()
# 關閉連接
conn.close()

技術分享圖片

基本操作:刪除信息——Delete

# -*- coding:utf-8 -*-
import pymysql

# 創建連接
conn = pymysql.connect(host=‘127.0.0.1‘, port=3306, user=‘root‘, passwd=‘‘, db=‘test_python‘, charset=‘utf8‘)
# 創建遊標
cursor = conn.cursor()
inp  = input(‘請輸入更新後的信息:‘)
ret  = cursor.execute("update course set cname = %s where cname = ‘哇哈哈4‘", inp)
ret2 = cursor.execute("update course set cname = %s where cname = ‘哇哈哈1‘", inp)
# 提交,不然無法保存新建或者修改的數據
conn.commit()
print(‘不存在且更新結果:‘, ret, ‘\r\n存在且更新結果:‘, ret2)
# 關閉遊標
cursor.close()
# 關閉連接
conn.close()

技術分享圖片

其他操作: 更改遊標的返回值為字典

# -*- coding:utf-8 -*-
import pymysql

# 創建連接
conn = pymysql.connect(host=‘127.0.0.1‘, port=3306, user=‘root‘, passwd=‘‘, db=‘test_python‘, charset=‘utf8‘)
# 創建遊標
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
cursor.execute(‘select cid as id , cname as name from course‘)  # 可以更改原理字典的key[cname]為name
print(cursor.fetchall())  # 可以根據字典取值
# 關閉遊標
cursor.close()
# 關閉連接
conn.close()

技術分享圖片

其他操作:獲取自增ID

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql

conn = pymysql.connect(host=‘127.0.0.1‘, port=3306, user=‘root‘, passwd=‘‘, db=‘test_python‘, charset=‘utf8‘)
cursor = conn.cursor()
cursor.executemany("insert into course(cname, teacher_id)values(%s,%s)", [("百事可樂", 1), ("可口可樂", 2)])
conn.commit()
# 獲取最新自增ID
new_id = cursor.lastrowid
print(new_id)
cursor.close()
conn.close()

防SQL註入的方法

防SQL註入的方法:

1. 存儲過程

2. 占位符拼接 切記用字符串拼接

SQL註入:更改了原來的sql語句,不推薦拼接,推薦參數傳遞

# -*- coding:utf-8 -*-
import pymysql

# 創建連接
conn = pymysql.connect(host=‘127.0.0.1‘, port=3306, user=‘root‘, passwd=‘‘, db=‘test_python‘, charset=‘utf8‘)
# 創建遊標
cursor = conn.cursor()
sql = ‘select * from course where cid = "%s" and cname = "%s"‘
# sql = sql % (‘24‘, ‘哇哈哈3‘)        # 正常
sql = sql % (‘24"-- ‘, ‘哇哈哈3‘)      # SQL註入取值,註釋掉了後面的內容
# sql = sql % (‘24" or 1=1 -- ‘, ‘哇哈哈3‘)   # SQL註入取值,後面的條件恒成立,可查詢所有結果
print(sql)
ret = cursor.execute(sql);
r = cursor.fetchall()
print(‘執行結果:‘, r)
# 關閉遊標
cursor.close()
# 關閉連接
conn.close()

技術分享圖片

Mysql學習---Python操作Mysql 1231