連接數據庫
- 連接時需要額外指定參數db
- cursor.execute(' ') 操作SQL語句
- SELECT VERSION() 獲得當前版本
- CREATE DATABASE spiders DEFAULT CHARACTER SET utf8 創建數據庫
import pymysql
db = pymysql.connect(host='localhost',user=' ',password=' ',port=3306)#IP,用戶名,密碼,端口號
cursor = db.cursor() #獲得操作游標,利用游標執行SQL語句
cursor.execute('SELECT VERSION()') #獲得當前版本
data = cursor.fetchone() #獲得第一條數據 ?
print('Database version:',data)
cursor.execute('CREATE DATABASE spiders DEFAULT CHARACTER SET utf8')//創建sriders數據庫,默認編碼utf-8
db.close()
創建表
- PRIMARY KEY 主鍵,創建表時主要指定主鍵
- 創建表:CREATE TABLE IF NOT EXISTS musicspider(指定字段)
import pymysql
db = pymysql.connect(host='localhost',user='root',password='密碼',port=3306,db='spiders')#連接數據庫,指定參數db
cursor = db.cursor()
sql = 'CREATE TABLE IF NOT EXISTS musicspider(songName VARCHAR(225) NOT NULL,singerName VAECHAR(225) NOT NULL,musicUrl VARCHAR(255) NOT NULL,PRIMARY KEY (songName))'
#創建表,‘字段名’‘字段類型’(大小)
#VERCHAR 變長字符串
cursor.execute(sql)
db.close()
插入數據
- INSERT INTO table(colum1,colum2...) values(格式符1,格式符2...)
import pymysql
db = pymysql.connect(host='localhost',user='root',password='密碼',port=3306,db='spiders')#連接數據庫
cursor = db.cursor()
songName = '當年情'
singerName = '張國榮'
musicURL = 'https://i.y.qq.com/v8/playsong.html?songid=102349891&source=yqq#wechat_redirect'
sql = 'INSERT INTO musicspider(songName,singerName,musicURL) values(%s,%s,%s)'
# 異常處理,執行失敗時調用rollback執行數據回滾,相當于什么都沒發生
try:cursor.execute(sql,(songName,singerName,musicURL))db.commit() # 提交后才能實現數據插入
except:db.rollback() # 執行數據回滾
db.close()
- 事務
- 原子性:要么發生要么不發生,不存在進行一半的情況
- 一致性:從一個一致性狀態到另一個一致性狀態
- 隔離性:事務與其他并發的事務隔離,互不干擾
- 持久性:永久性
- 插入更新刪除操作都是對數據庫進行更改的操作,而更改操作必須是一個事務,所以操作的標準寫法:
try:cursor.execute(sql)db.commit()
except:db.rollback()
data = {'songName':'當年情''singerName':'張國榮''musicURL':'https://i.y.qq.com/v8/playsong.html?songid=102349891&source=yqq#wechat_redirect'
}
table = 'musicspider'
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())): # sql構造占位符,調用execute需要字典鍵值作參數print("successful")db.commit()
except:print('failed')db.rollback()
db.close()
更新數據
- 構造SQL語句,執行execute()方法,傳入元組形式的參數,執行commit提交操作
sql = 'UPDATE musicspider SET musicURL = %s WHERE songName = %s'
try:cursor.execute(sql,('*****','***'))db.commit
except:db.rollback()
db.close()
data = {,,}table =
keys =
values = sql = 'INSTRT 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 += updatetry:if cursor.execute(sql,tuple(data.values())*2):print("Successful")db.commit()
except:print("Failed")db.rollback()db.close()
刪除數據
table = #刪除目標表明
condition = #刪除條件sql = 'DELETE FROM {table} WHERE {condition}'.format{table = table,condition = condition}try:cursor.execute(sql)db.commit()
except:db.rollback()db.close()
查詢數據
- SELECT語句
- sql = 'SELECT * FROM {table} WHERE {condition}'
- fetchall()和fetchone() 返回結果內部有一個偏移指針用來指向查詢結果,最開始偏移指針指向第一條數據,取出之后指針偏移到下一條數據,再取時會取到下一跳數據
sql = 'SELECT *FROM {} WHERE {}'try:cursor.execute(sql)print('count:'cursor.rowcount)row = cursor.fetchone()while row:print('row:'row)row = cursor.fetchone()
except:print('Error')
navicat連接mysql報錯1251
解決方式:更改加密方式
- 登錄mysql
- 更改加密方式
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;
Query OK, 0 rows affected (0.10 sec)
- 更新密碼
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密碼';
Query OK, 0 rows affected (0.35 sec)
- 刷新
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.28 sec)
- 重新連接