1. 程式人生 > 其它 >08、python操作mysql

08、python操作mysql

python操作mysql

 

一、python連線資料庫

import pymysql

db = pymysql.connect("資料庫ip","使用者","密碼","資料庫" ) # 開啟資料庫連線
cursor.execute("SELECT VERSION()")                    # 使用 execute() 方法執行 SQL 查詢
data = cursor.fetchone()                              # 使用 fetchone() 方法獲取單條資料
print ("Database version : %s " % data)
db.close()                                            # 關閉資料庫連線
import pymysql

conn = pymysql.connect(
       host='localhost',
       user='root',
       password="root",
       database='db',
       port=3306, charset='utf-8',
)

cur = conn.cursor(cursor=pymysql.cursors.DictCursor)

二、建立表操作

import pymysql

# 開啟資料庫連線
db = pymysql.connect(
   "localhost",
   "testuser",
   "test123",
   "TESTDB"
)

# 使用 cursor() 方法建立一個遊標物件 cursor
cursor = db.cursor()

# 使用 execute() 方法執行 SQL,如果表存在則刪除
cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")

# 使用預處理語句建立表
sql = """CREATE TABLE EMPLOYEE (
        FIRST_NAME CHAR(20) NOT NULL,
        LAST_NAME CHAR(20),
        AGE INT,  
        SEX CHAR(1),
        INCOME FLOAT )"""

cursor.execute(sql)

# 關閉資料庫連線
db.close()

三、操作資料

1、插入操作

import pymysql

# 開啟資料庫連線
db = pymysql.connect(
   "localhost",
   "testuser",
   "test123",
   "TESTDB"
)

# 使用cursor()方法獲取操作遊標
cursor = db.cursor()

# SQL 插入語句
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
        LAST_NAME, AGE, SEX, INCOME)
        VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""
try:
  cursor.execute(sql) # 執行sql語句
  db.commit()         # 提交到資料庫執行
except:
  db.rollback()       # 如果發生錯誤則回滾

# 關閉資料庫連線
db.close()
import pymysql

# 開啟資料庫連線
db = pymysql.connect(
   "localhost",
   "testuser",
   "test123",
   "TESTDB"
)

# 使用cursor()方法獲取操作遊標
cursor = db.cursor()

# SQL 插入語句
sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \
      LAST_NAME, AGE, SEX, INCOME) \
      VALUES (%s, %s, %s, %s, %s )" % \
      ('Mac', 'Mohan', 20, 'M', 2000)
try:
 
  cursor.execute(sql)  # 執行sql語句
  db.commit()          # 執行sql語句
except:
  db.rollback()        # 發生錯誤時回滾

# 關閉資料庫連線
db.close()

2、查詢操作

Python查詢Mysql使用 fetchone() 方法獲取單條資料, 使用fetchall() 方法獲取多條資料。

  • fetchone(): 該方法獲取下一個查詢結果集。結果集是一個物件

  • fetchall(): 接收全部的返回結果行.

  • rowcount: 這是一個只讀屬性,並返回執行execute()方法後影響的行數。

import pymysql

# 開啟資料庫連線
db = pymysql.connect("localhost","testuser","test123","TESTDB" )

# 使用cursor()方法獲取操作遊標
cursor = db.cursor()

# SQL 查詢語句
sql = "SELECT * FROM EMPLOYEE \
      WHERE INCOME > %s" % (1000)
try:
 
  cursor.execute(sql)# 執行SQL語句
  results = cursor.fetchall()# 獲取所有記錄列表
  for row in results:
    fname = row[0]
    lname = row[1]
    age = row[2]
    sex = row[3]
    income = row[4]
      # 列印結果
    print ("fname=%s,lname=%s,age=%s,sex=%s,income=%s" % \
            (fname, lname, age, sex, income ))
except:
  print ("Error: unable to fetch data")

# 關閉資料庫連線
db.close()

3、更新操作

import pymysql

# 開啟資料庫連線
db = pymysql.connect("localhost","testuser","test123","TESTDB" )

# 使用cursor()方法獲取操作遊標
cursor = db.cursor()

# SQL 更新語句
sql = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = '%c'" % ('M')
try:
  cursor.execute(sql) # 執行SQL語句
  db.commit()         # 提交到資料庫執行
except
  db.rollback()       # 發生錯誤時回滾

# 關閉資料庫連線
db.close()

4、刪除操作

import pymysql

# 開啟資料庫連線
db = pymysql.connect("localhost","testuser","test123","TESTDB" )

# 使用cursor()方法獲取操作遊標
cursor = db.cursor()

# SQL 刪除語句
sql = "DELETE FROM EMPLOYEE WHERE AGE > %s" % (20)
try
  cursor.execute(sql) # 執行SQL語句
  db.commit()         # 提交修改
except
  db.rollback()       # 發生錯誤時回滾# 關閉連線
db.close()

四、資料備份

1、資料庫的邏輯備份

#語法:
# mysqldump -h 伺服器 -u使用者名稱 -p密碼 資料庫名 > 備份檔案.sql

#示例:
#單庫備份
mysqldump -uroot -p123 db1 > db1.sql
mysqldump -uroot -p123 db1 table1 table2 > db1-table1-table2.sql

#多庫備份
mysqldump -uroot -p123 --databases db1 db2 mysql db3 > db1_db2_mysql_db3.sql

#備份所有庫
mysqldump -uroot -p123 --all-databases > all.sql 

2、資料恢復

#方法一:
[root@jason backup]# mysql -uroot -p123 < /backup/all.sql

#方法二:
mysql> use db1;
mysql> SET SQL_LOG_BIN=0;   #關閉二進位制日誌,只對當前session生效
mysql> source /root/db1.sql

 

五、事務和鎖

begin;  # 開啟事務
select * from emp where id = 1 for update;  # 查詢id值,for update新增行鎖;
update emp set salary=10000 where id = 1; # 完成更新
commit; # 提交事務

###

六、python操作MySQL

python	膠水語言、調包俠(貶義詞>>>褒義詞)
"""
python這門語言本身並不牛逼 牛逼的是支援該語言的各種功能強大的模組、軟體
"""
# 後期在使用python程式設計的時候 很多看似比較複雜功能可能都已經有相應的模組

模組名字 pymysql

下載模組
	1.命令列
    	pip3 install pymysql
		pip3 install pymysql -i 源地址
    2.藉助於pycharm
    3.python直譯器配置檔案

1、模組基本使用

import pymysql


# 建立連結
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='123',
    database='db_5',
    charset='utf8'
)
# 生成一個遊標物件
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 讓資料自動組織成字典
# 定義SQL語句
sql = 'select * from userinfo'
# 執行SQL語句
cursor.execute(sql)
# 獲取返回結果
res = cursor.fetchall()
print(res)

2、SQL注入問題

import pymysql

# 建立連結
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='123',
    database='db_5',
    charset='utf8'
)
# 生成一個遊標物件
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 讓資料自動組織成字典
# 獲取使用者名稱和密碼
username = input('username>>>:').strip()
password = input('password>>>:').strip()
# 構造SQL語句
# sql = "select * from userinfo where name='%s' and password='%s'"%(username,password)
# 針對核心資料 不要自己拼接 交由execute方法幫你篩選再拼接
sql = "select * from userinfo where name=%s and password=%s"
print(sql)
# 執行SQL語句
cursor.execute(sql,(username,password))
res = cursor.fetchall()
if res:
    print(res)
    print('登入成功')
else:
    print('使用者名稱或密碼錯誤')
"""
登入功能
    1.獲取使用者名稱和密碼
    2.基於使用者名稱和密碼直接精準查詢
"""
"""
問題1 
    使用者名稱正確 不需要密碼也能登入
問題2
    使用者名稱和密碼都不需要也能登入

SQL注入問題的產生
    就是通過一些特殊符號的組合 達到某些特定的效果從而避免常規的邏輯
SQL注入問題如何解決
    execute方法自動幫你解決
"""

3、功能補充

import pymysql

# 建立連結
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='123',
    database='db_5',
    charset='utf8',
    autocommit=True  # 涉及到增刪改 自動二次確認
)
# 生成一個遊標物件
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 讓資料自動組織成字典
sql1 = 'select * from userinfo'
sql2 = 'insert into userinfo(name,password) values(%s,%s)'
sql3 = 'update userinfo set name="jasonNB" where id=1'
sql4 = 'delete from userinfo where id=2'

# 1.查詢語句可以正常執行並獲取結果
# cursor.execute(sql1)
# 2.插入語句能夠執行 但是並沒有影響表資料
# cursor.execute(sql2,('jackson',666))
# 3.更新語句能夠執行 但是並沒有影響表資料
# res = cursor.execute(sql3)
# print(res)
# 4.刪除語句能夠執行 但是並沒有影響表資料
# res = cursor.execute(sql4)
# print(res)

'''針對增刪改操作 需要二次確認才可生效'''
# cursor.execute(sql2,('jackson',666))
# conn.commit()
# cursor.execute(sql3)
# conn.commit()
# cursor.execute(sql4)
# conn.commit()

cursor.executemany(sql2,[('jason111',123),('jason222',321),('jason333',222)])



# 主動關閉連結 釋放資源
# conn.close()

4、註冊登入功能

def register(cursor):
    # 獲取使用者名稱和密碼
    username = input('username>>>:').strip()
    password = input('password>>>:').strip()
    # 驗證使用者名稱是否已存在
    sql = 'select * from userinfo where name=%s'
    cursor.execute(sql, (username,))
    res = cursor.fetchall()
    if not res:
        sql1 = 'insert into userinfo(name,password) values(%s,%s)'
        cursor.execute(sql1, (username, password))
        print('使用者:%s註冊成功' % username)
    else:
        print('使用者名稱已存在')


def login(cursor):
    # 獲取使用者名稱和密碼
    username = input('username>>>:').strip()
    password = input('password>>>:').strip()
    # 先獲取是否存在使用者名稱相關的資料
    sql = 'select * from userinfo where name=%s'
    cursor.execute(sql, (username,))
    res = cursor.fetchall()		# 得到一個列表套字典
    if res:
        # 校驗密碼
        real_dict = res[0]
        if password == str(real_dict.get('password')):	# 密碼的型別為整形
            print('登入成功')
        else:
            print('密碼錯誤')
    else:
        print('使用者名稱不存在')


def get_conn():
    import pymysql
    # 建立連結
    conn = pymysql.connect(
        host='127.0.0.1',
        port=3306,
        user='root',
        password='123',
        database='db_5',
        charset='utf8',
        autocommit=True  # 涉及到增刪改 自動二次確認
    )
    # 生成一個遊標物件
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 讓資料自動組織成字典
    return cursor


func_dic = {'1': register, '2': login}
while True:
    print("""
    1.註冊功能
    2.登入功能
    """)
    cursor = get_conn()
    choice = input('請輸入功能編號>>>:').strip()
    if choice in func_dic:
        func_name = func_dic.get(choice)
        func_name(cursor)
    else:
        print('暫時沒有當前功能編號')

作業

1.整理今日內容並完成部落格編寫
2.熟練完成多表查詢練習題(課上五道題必須搞會)
3.註冊登入功能必須脫稿完成