python操作Mysql數據庫示例


python庫:pymysql

安裝:install pymysql、mysql數據庫

一、連接數據庫、創建speder庫、查詢版本、

import pymysql
##鏈接數據庫
db = pymysql.connect(host='localhost',user='root', password='123456', port=3306)
##用 cursor() 方法獲得 MySQL 的操作游標,利用游標來執行 SQL 語句
cursor = db.cursor()
##查詢數據庫版本語句
cursor.execute('SELECT VERSION()')
##調用fetchone() 方法來獲得第一條數據,也就得到了版本號
data = cursor.fetchone()
print('Database version:', data)
##執行了創建數據庫的操作,數據庫名稱叫做 spiders,默認編碼為 utf-8
#cursor.execute("CREATE DATABASE spiders DEFAULT CHARACTER SET utf8")
db.close()

二、創建表

 
         
import pymysql
##創建表
'''
字段名    含義    類型
id    學號    varchar
name    姓名    varchar
age    年齡    int
'''

db = pymysql.connect(host='localhost', user='root', password='123456', port=3306, db='spiders')
cursor = db.cursor()
sql = 'CREATE TABLE IF NOT EXISTS students (id VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, age INT NOT NULL, PRIMARY KEY (id))'
cursor.execute(sql)
db.close()

三、插入數據

#簡單插入數據
import pymysql
id = '20120001'
user = 'Bob'
age = 20
db = pymysql.connect(host='localhost', user='root', password='123456', port=3306, db='spiders')
cursor = db.cursor()
sql = 'INSERT INTO students(id, name, age) values(%s, %s, %s)'

#升級1.0插入數據,啟用防錯
try:
    cursor.execute(sql, (id, user, age))
    '''
    執行 db 對象的 commit() 方法才可實現數據插入,
    這個方法才是真正將語句提交到數據庫執行的方法,
    對於數據插入、更新、刪除操作都需要調用該方法才能生效
    '''
    db.commit()
except:
    #如果出錯了就把所有數據回滾(即撤消),就像沒操作之前一樣
    db.rollback()
db.close()

3.1、【插入數據2.0升級版,用字典插入數據,不用修改sql語句,只要修改字典即可】

data = {
    'id': '20120001',
    'name': 'Bob',
    'age': 20
}
table = 'students'
keys = ', '.join(data.keys())
values = ', '.join(['%s'] * len(data))
sql = 'INSERT INTO {table}({keys}) VALUES ({values})'.format(table=table, keys=keys, values=values)
try:
   if cursor.execute(sql, tuple(data.values())):
       print('Successful')
       db.commit()
except:
    print('Failed')
    db.rollback()
db.close()

 四、更新數據

#最簡單的方式就是構造一個 SQL 語句然后執行
sql = 'UPDATE students SET age = %s WHERE name = %s'
try:
   cursor.execute(sql, (25, 'Bob'))
   db.commit()
except:
   db.rollback()
db.close()


#【升級版更新數據用字典傳入,不需改sql語句】
data = {
    'id': '20120001',
    'name': 'Bob',
    'age': 21
}

table = 'students'
keys = ', '.join(data.keys())
values = ', '.join(['%s'] * len(data))

#實際用的是插入語句,不過加了ON DUPLICATE KEY UPDATE(主鍵存在,則執行更新操作)
sql = 'INSERT INTO {table}({keys}) VALUES ({values}) ON DUPLICATE KEY UPDATE'.format(table=table, keys=keys, values=values)
update = ','.join([" {key} = %s".format(key=key) for key in data])
sql += update
try:
    if cursor.execute(sql, tuple(data.values())*2):
        print('Successful')
        db.commit()
except:
    print('Failed')
    db.rollback()
db.close()   

''' 在這里完整的 SQL 構造出來是這樣的: INSERT INTO students(id, name, age) VALUES (%s, %s, %s) ON DUPLICATE KEY UPDATE id = %s, name = %s, age = %s 相比上面介紹的插入操作的 SQL,后面多了一部分內容,那就是更新的字段,ON DUPLICATE KEY UPDATE 使得主鍵已存在的數據進行更新,
后面跟的是更新的字段內容。所以這里就變成了 6 個 %s。所以在后面的 execute() 方法的第二個參數元組就需要乘以 2 變成原來的 2 倍。 如此一來,我們就可以實現主鍵不存在便插入數據,存在則更新數據的功能了 '''
 
        

五、刪除數據

#刪除
table = 'students'
condition = 'age > 20'

sql = 'DELETE FROM  {table} WHERE {condition}'.format(table=table, condition=condition)
try:
    cursor.execute(sql)
    db.commit()
except:
    db.rollback()

db.close()
'''
這里我們指定了表的名稱,刪除條件。因為刪除條件可能會有多種多樣,運算符比如有大於、小於、等於、LIKE等等,
條件連接符比如有 AND、OR 等等,所以不再繼續構造復雜的判斷條件,在這里直接將條件當作字符串來傳遞,以實現刪除操作
'''

六、查詢數據

#【查詢數據,升級操作,防止內存開銷過大】
sql = 'SELECT * FROM students WHERE age >= 20'
try:
    cursor.execute(sql)
    print('Count:', cursor.rowcount)
    row = cursor.fetchone()
    while row:
        print('Row:', row)
        row = cursor.fetchone()
except:
    print('Error')

'''
不用fetchall,而用fetchone這樣每循環一次,
指針就會偏移一條數據,隨用隨取,簡單高效
'''


#查詢數據,簡單操作會比較費內存
sql = 'SELECT * FROM students WHERE age >= 20'
try:
    cursor.execute(sql)
    print('Count:', cursor.rowcount)
    one = cursor.fetchone()
    print('One:', one)
    results = cursor.fetchall()
    print('Results:', results)
    print('Results Type:', type(results))
    for row in results:
        print(row)
except:
    print('Error')
'''
運行結果:
Count: 4
One: ('20120001', 'Bob', 25)
Results: (('20120011', 'Mary', 21), ('20120012', 'Mike', 20), ('20120013', 'James', 22))
Results Type: <class 'tuple'>
('20120011', 'Mary', 21)
('20120012', 'Mike', 20)
('20120013', 'James', 22)
'''

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM