from pymysql? import *
class JD(object):
def __init__(self):
# 創(chuàng)建Connection連接
? ? ? ? self.conn = connect(host='localhost', port=3306, user='root', password='wjh830724', database='jd', charset='utf8')
# 獲得Cursor對象
? ? ? ? self.cursor =self.conn.cursor()
def excute_sql(self,sql):
self.cursor.execute(sql)
for tempin self.cursor.fetchall():
print(temp)
def show_all_items(self):
"""查詢所有商品"""
? ? ? ? sql ='select * from goods;'
? ? ? ? self.excute_sql(sql)
def? __del__(self):
# 關(guān)閉Cursor對象
? ? ? ? self.cursor.close()
self.conn.close()
def show_cates(self):
"""所有的商品分類"""
? ? ? ? sql ='select name from goods_cates;'
? ? ? ? self.excute_sql(sql)
def show_brands(self):
"""所有商品品牌分類"""
? ? ? ? sql ='select name from goods_brands;'
? ? ? ? self.excute_sql(sql)
def add_cates(self):
"""添加商品分類"""
? ? ? ? item_name = input('請輸入新類商品名稱:')
sql ="""insert into goods_cates (name) values ("%s");""" %item_name
self.cursor.execute(sql)
self.conn.commit()
def delete_cates(self):
"""刪除商品分類"""
? ? ? ? item_name = input('請輸入新類商品名稱:')
sql ="""delete from goods_cates where name = '%s';""" %item_name
self.cursor.execute(sql)
self.conn.commit()
def update_cates(self):
"""修改商品分類"""
? ? ? ? item_name_old = input('請輸入更改前名字:')
item_name_new = input('請輸入更改后名字:')
sql ="""update goods_cates set name = '%s' where name = '%s';""" %(item_name_new,item_name_old)
self.cursor.execute(sql)
self.conn.commit()
def get_into_by_name(self):
fint_name = input('請輸入商品名字:')
# sql = """select * from goods where name="%s";""" %fint_name
# print("-->%s<--" % sql)
# self.cursor.execute(sql)
? ? ? ? sql ="select * from goods where name=%s"
? ? ? ? self.cursor.execute(sql,[fint_name])
print(self.cursor.fetchall())
def add_brands(self):
"""添加商品品牌分類"""
? ? ? ? item_name = input('請輸入新類商品名稱:')
sql ="""insert into goods_brands (name) values ("%s");""" %item_name
self.cursor.execute(sql)
self.conn.commit()
def delete_brands(self):
"""刪除商品品牌分類"""
? ? ? ? item_name = input('請輸入新類商品名稱:')
sql ="""delete from goods_brands where name = '%s';""" %item_name
self.cursor.execute(sql)
self.conn.commit()
def update_brands(self):
"""修改商品品牌分類"""
? ? ? ? item_name_old = input('請輸入更改前名字:')
item_name_new = input('請輸入更改后名字:')
sql ="""update goods_brands set name = '%s' where name = '%s';""" %(item_name_new,item_name_old)
self.cursor.execute(sql)
self.conn.commit()
@staticmethod
? ? def print_menu():
print('------京東------')
print('1.所有商品')
print('2.所有的商品分類')
print('3.所有商品品牌分類')
print('4.添加商品分類')
print('5.刪除商品分類')
print('6.修改商品分類')
print('7.根據(jù)名字查詢商品')
print('8.添加商品品牌')
print('9.刪除商品品牌')
print('10.修改商品品牌')
return input('請輸入功能應(yīng)用序號:')
def run(self):
while True:
num =self.print_menu()
if num =='1':
#所有商品
? ? ? ? ? ? ? ? self.show_all_items()
elif num =='2':
#所有的商品分類
? ? ? ? ? ? ? ? self.show_cates()
elif num =='3':
#所有商品品牌分類
? ? ? ? ? ? ? ? self.show_brands()
elif num =='4':
#添加商品分類
? ? ? ? ? ? ? ? self.add_cates()
elif num =='5':
#刪除商品分類
? ? ? ? ? ? ? ? self.delete_cates()
elif num =='6':
#修改商品分類
? ? ? ? ? ? ? ? self.update_cates()
elif num =='7':
#根據(jù)名字查詢商品
? ? ? ? ? ? ? ? self.get_into_by_name()
elif num =='8':
#添加商品品牌分類
? ? ? ? ? ? ? ? self.add_brands()
elif num =='9':
#刪除商品品牌分類
? ? ? ? ? ? ? ? self.delete_brands()
elif num =='10':
#修改商品品牌分類
? ? ? ? ? ? ? ? self.update_brands()
else:
print('輸入錯誤')
def main():
#創(chuàng)建對象
? ? jd = JD()
#用一個run方法跑來
? ? jd.run()
if? __name__ =='__main__':
main()
索引
索引是什么
索引是一種特殊的文件(InnoDB數(shù)據(jù)表上的索引是表空間的一個組成部分)较沪,它們包含著對數(shù)據(jù)表里所有記錄的引用指針路鹰。
更通俗的說盼铁,數(shù)據(jù)庫索引好比是字典前面的目錄诡蜓,能加快數(shù)據(jù)庫的查詢速度
索引目的
提高查詢效率
-- 開啟運行時間監(jiān)測:
set profiling=1;
-- 查看執(zhí)行的時間:
show profiles;
-- 查看索引
show indexfrom 表名;
-- 刪除索引:
drop index索引名稱 on 表名;
所以比較占磁盤鹦蠕,比建議建索引
如果數(shù)據(jù)很大蜀撑,并且經(jīng)常查矢炼,建立索引
賬戶管理
在生產(chǎn)環(huán)境下操作數(shù)據(jù)庫時析藕,絕對不可以使用root賬戶連接赫蛇,而是創(chuàng)建特定的賬戶绵患,授予這個賬戶特定的操作權(quán)限,然后連接進(jìn)行操作悟耘,主要的操作就是數(shù)據(jù)的crud
MySQL賬戶體系:根據(jù)賬戶所具有的權(quán)限的不同落蝙,MySQL的賬戶可以分為以下幾種
服務(wù)實例級賬號:啟動了一個mysqld,即為一個數(shù)據(jù)庫實例作煌;如果某用戶如root,擁有服務(wù)實例級分配的權(quán)限掘殴,那么該賬號就可以刪除所有的數(shù)據(jù)庫、連同這些庫中的表
數(shù)據(jù)庫級別賬號:對特定數(shù)據(jù)庫執(zhí)行增刪改查的所有操作
數(shù)據(jù)表級別賬號:對特定表執(zhí)行增刪改查等所有操作
字段級別的權(quán)限:對某些表的特定字段進(jìn)行操作
存儲程序級別的賬號:對存儲程序進(jìn)行增刪改查的操作
賬戶的操作主要包括創(chuàng)建賬戶粟誓、刪除賬戶奏寨、修改密碼、授權(quán)權(quán)限等
授予權(quán)限
需要使用實例級賬戶登錄后操作鹰服,以root為例
主要操作包括:
查看所有用戶
修改密碼
刪除用戶
查看所有用戶
所有用戶及權(quán)限信息存儲在mysql數(shù)據(jù)庫的user表中
查看user表的結(jié)構(gòu)
desc user;
主要字段說明:
Host表示允許訪問的主機(jī)
User表示用戶名
authentication_string表示密碼病瞳,為加密后的值
查看所有用戶
selecthost,user,authentication_stringfromuser;
建賬戶、授權(quán)
需要使用實例級賬戶登錄后操作悲酷,以root為例
常用權(quán)限主要包括:create套菜、alter、drop设易、insert逗柴、update、delete顿肺、select
如果分配所有權(quán)限戏溺,可以使用all privileges
grant權(quán)限列表on數(shù)據(jù)庫to'用戶名'@'訪問主機(jī)'identifiedby'密碼';
查看用戶有哪些權(quán)限
show grants for laoweng@localhost;
賬戶操作
修改權(quán)限
grant權(quán)限名稱on數(shù)據(jù)庫to賬戶@主機(jī)with grant option;
-- 刷新權(quán)限flush privileges;
修改密碼
使用root登錄渣蜗,修改mysql數(shù)據(jù)庫的user表
使用password()函數(shù)進(jìn)行密碼加密
update user set authentication_string=password('新密碼') where user='用戶名';
例:update user set authentication_string=password('123') where user='laoweng';
注意修改完成后需要刷新權(quán)限
刷新權(quán)限:flush privileges
遠(yuǎn)程登錄(危險慎用)
如果向在一個Ubuntu中使用msyql命令遠(yuǎn)程連接另外一臺mysql服務(wù)器的話,通過以下方式即可完成旷祸,但是此方法僅僅了解就好了耕拷,不要在實際生產(chǎn)環(huán)境中使用
修改 /etc/mysql/mysql.conf.d/mysqld.cnf 文件
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
然后重啟msyql
sudo service mysql restart
刪除賬戶
1.使用root登錄? ?推薦使用
drop user'用戶名'@'主機(jī)';
2.使用root登錄,刪除mysql數(shù)據(jù)庫的user表中數(shù)據(jù)
delete from user where user='用戶名';
-- 操作結(jié)束之后需要刷新權(quán)限flush privileges
MySQL主從同步配置
1. 主從同步的定義
主從同步使得數(shù)據(jù)可以從一個數(shù)據(jù)庫服務(wù)器復(fù)制到其他服務(wù)器上托享,在復(fù)制數(shù)據(jù)時骚烧,一個服務(wù)器充當(dāng)主服務(wù)器(master),其余的服務(wù)器充當(dāng)從服務(wù)器(slave)闰围。因為復(fù)制是異步進(jìn)行的赃绊,所以從服務(wù)器不需要一直連接著主服務(wù)器,從服務(wù)器甚至可以通過撥號斷斷續(xù)續(xù)地連接主服務(wù)器辫诅。通過配置文件凭戴,可以指定復(fù)制所有的數(shù)據(jù)庫,某個數(shù)據(jù)庫炕矮,甚至是某個數(shù)據(jù)庫上的某個表。
使用主從同步的好處:
通過增加從服務(wù)器來提高數(shù)據(jù)庫的性能者冤,在主服務(wù)器上執(zhí)行寫入和更新肤视,在從服務(wù)器上向外提供讀功能,可以動態(tài)地調(diào)整從服務(wù)器的數(shù)量涉枫,從而調(diào)整整個數(shù)據(jù)庫的性能邢滑。
提高數(shù)據(jù)安全,因為數(shù)據(jù)已復(fù)制到從服務(wù)器愿汰,從服務(wù)器可以終止復(fù)制進(jìn)程困后,所以,可以在從服務(wù)器上備份而不破壞主服務(wù)器相應(yīng)數(shù)據(jù)
在主服務(wù)器上生成實時數(shù)據(jù)衬廷,而在從服務(wù)器上分析這些數(shù)據(jù)摇予,從而提高主服務(wù)器的性能
2. 主從同步的機(jī)制
Mysql服務(wù)器之間的主從同步是基于二進(jìn)制日志機(jī)制,主服務(wù)器使用二進(jìn)制日志來記錄數(shù)據(jù)庫的變動情況吗跋,從服務(wù)器通過讀取和執(zhí)行該日志文件來保持和主服務(wù)器的數(shù)據(jù)一致侧戴。
在使用二進(jìn)制日志時,主服務(wù)器的所有操作都會被記錄下來跌宛,然后從服務(wù)器會接收到該日志的一個副本酗宋。從服務(wù)器可以指定執(zhí)行該日志中的哪一類事件(譬如只插入數(shù)據(jù)或者只更新數(shù)據(jù)),默認(rèn)會執(zhí)行日志中的所有語句疆拘。
每一個從服務(wù)器會記錄關(guān)于二進(jìn)制日志的信息:文件名和已經(jīng)處理過的語句蜕猫,這樣意味著不同的從服務(wù)器可以分別執(zhí)行同一個二進(jìn)制日志的不同部分,并且從服務(wù)器可以隨時連接或者中斷和服務(wù)器的連接哎迄。
主服務(wù)器和每一個從服務(wù)器都必須配置一個唯一的ID號(在my.cnf文件的[mysqld]模塊下有一個server-id配置項)回右,另外隆圆,每一個從服務(wù)器還需要通過CHANGE MASTER TO語句來配置它要連接的主服務(wù)器的ip地址,日志文件名稱和該日志里面的位置(這些信息存儲在主服務(wù)器的數(shù)據(jù)庫里)
3. 配置主從同步的基本步驟
有很多種配置主從同步的方法楣黍,可以總結(jié)為如下的步驟:
在主服務(wù)器上匾灶,必須開啟二進(jìn)制日志機(jī)制和配置一個獨立的ID
在每一個從服務(wù)器上,配置一個唯一的ID租漂,創(chuàng)建一個用來專門復(fù)制主服務(wù)器數(shù)據(jù)的賬號
在開始復(fù)制進(jìn)程前阶女,在主服務(wù)器上記錄二進(jìn)制文件的位置信息
如果在開始復(fù)制之前,數(shù)據(jù)庫中已經(jīng)有數(shù)據(jù)哩治,就必須先創(chuàng)建一個數(shù)據(jù)快照(可以使用mysqldump導(dǎo)出數(shù)據(jù)庫秃踩,或者直接復(fù)制數(shù)據(jù)文件)
配置從服務(wù)器要連接的主服務(wù)器的IP地址和登陸授權(quán),二進(jìn)制日志文件名和位置