您好,登錄后才能下訂單哦!
這篇文章主要介紹了mysql client如何操作MySQL關系型數據庫,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
主要講解mysqlclient操作MySQL關系型數據庫,安裝mysqlclient的命令行:pip install mysqlclient
;
然后創建一個名為XKD_Python_Course的數據庫和一張名為students的數據庫表,我們先在命令行工具里面查看一下表名是否存在,登錄mysql數據庫的命令行:mysql -uroot -p
,然后show databases;
,發現沒有XKD_Python_Course這個數據庫,那我們就創建一個:create database XKD_Python_Course;
,創建完再:show databases;
一下,可以看到XKD_Python_Course數據庫已經存在了
然后我們可以使用命令行:use XKD_Python_Course;
進入這個庫,然后開始創建數據庫表;
CREATE TABLE `students` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `age` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
然后可以通過命令行:show create table students;
,查看一下創建表的創建;
還可以通過命令行:desc students;
,查看表的結構;
此時我們已經創建好了數據庫和數據庫表,然后我們需要授權用戶,設置密碼,授權成功之后一定要記得刷新權限;
grant all on XKD_Python_Course.* to 'zengzeng'@'%' identified by '123456'; # 刷新權限 flush privileges;
授權后我們可以退出,然后登錄我們剛剛授權的用戶:mysql -uzengzeng -p123456
,就可以成功登錄,登錄后可以show databases;
查看一下剛剛創建的數據庫
然后我們可以看到里面有兩個數據庫,如果我們想操作XKD_Python_Cours,那我們就需要使用:use XKD_Python_Course
剛剛我們安裝的mysqlclient中有一個MySQLdb類,我們可以用這個MySQLdb類去操作mysql數據庫
插入操作,在插入之前我們可以先查看一下數據表里是否已經存在這條數據:select * from students;
,然后可以放心的進行插入了
import MySQLdb connect = None # 連接對象 cursor = None # 游標對象 try: # 連接對象 connect = MySQLdb.connect(host='localhost', # 主機地址 user='zengzeng', # 賬號 password='123456', # 密碼 database='XKD_Python_Course', # 數據庫名 use_unicode=True, charset='utf8') # 指定字符集 # 游標對象 cursor = connect.cursor() # 通過連接對象調用cursor() except Exception as e: print(e) connect.close() try: if cursor: result = cursor.execute("insert into students (name, age) values ('Angle', 18)") # 插入操作 print('result = {}'.format(result)) connect.commit() # 提交 except Exception as e: print(e) connect.rollback() # 回滾 finally: if cursor: cursor.close() if connect: connect.close()
執行代碼,返回的結果是result = 1,表示操作了一行數據,這時我們查看數據庫表select * from students;
,是不是發現表中多了一條數據啊;
批量插入數據,就是在插入數據的地方增加一個for循環,我們來試一下一次插入10條數據;
import MySQLdb connect = None # 連接對象 cursor = None # 游標對象 try: # 連接對象 connect = MySQLdb.connect(host='localhost', # 主機地址 user='zengzeng', # 賬號 password='123456', # 密碼 database='XKD_Python_Course', # 數據庫名 use_unicode=True, charset='utf8') # 指定字符集 # 游標對象 cursor = connect.cursor() # 通過連接對象調用cursor() except Exception as e: print(e) connect.close() try: if cursor: for i in range(10): result = cursor.execute("insert into students (name, age) values ('Angle', {})".format(i)) # 插入操作 connect.commit() # 提交 except Exception as e: print(e) connect.rollback() # 回滾 finally: if cursor: cursor.close() if connect: connect.close()
查詢數據,查詢結果的id會隨著游標往下走
import MySQLdb from pprint import pprint # 換行 connect = None # 連接對象 cursor = None # 游標對象 try: # 連接對象 connect = MySQLdb.connect(host='localhost', # 主機地址 user='zengzeng', # 賬號 password='123456', # 密碼 database='XKD_Python_Course', # 數據庫名 use_unicode=True, charset='utf8') # 指定字符集 # 游標對象 cursor = connect.cursor() # 通過連接對象調用cursor() except Exception as e: print(e) connect.close() try: if cursor: cursor.execute('select * from students') # 不會返回任何對象,想要拿到數據可以通過cursor.方法名 one_result = cursor.fetchone() # 查詢結果集的下一條數據 many_result = cursor.fetchmany(5) # 查詢結果集的下五條數據 all_result = cursor.fetchall() # 查詢結果集的剩余所有數據 # 換行打印 pprint(one_result) print('*' * 100) pprint(many_result) print('*' * 100) pprint(all_result) connect.commit() # 提交 except Exception as e: print(e) connect.rollback() # 回滾 finally: if cursor: cursor.close() if connect: connect.close()
cursor是游標對象,用于執行查詢和獲取結果;
execute(op[,args])
:執行一個數據庫的查詢和命令;
fetchmany(size)
:獲取結果集的下幾行務;
fetchone()
:獲取結果集的下一行;
fetchall()
:獲取結果集中剩下的所有行;
rowcount()
:最近一次execute返回數據的行數或影響的行數;
close()
:關閉游標對象;
在使用子查詢的時候,我們就可以使用查詢參數
# 位置參數 cursor.execute('select * from students where id = %s', args=(10, )) # 關鍵字參數 cursor.execute('select * from students where id = %(id)s', args={'id': 10})
會自動關閉游標
import MySQLdb connect = MySQLdb.connect(host='localhost', user='zengzeng', password='123456', database='XKD_Python_Course', use_unicode=True, charset='utf8') with connect as cursor: # 會自動關閉cursor對象 cursor.execute("insert into students (name, age) values ('zengzeng', 22)") # 此時連接還沒有關閉 cursor.execute("insert into students (name, age) values ('Mark', 23)") connect.close()
Queue模塊實現了多生產者多消費者隊列,尤其適合多線程編程,Queue類中實現了所有需要的鎖原語,Queue模塊實現了三種類型隊列:
第一種,FIFO(先進先出)隊列,第一加入隊列的任務,被第一個取出;
第二種,LIFO(后進先出)隊列,最后加入隊列的任務,被第一個取出(操作類似與棧,總是從棧頂取出,這個隊列還不清楚內部的實現);
第三種,PriorityQueue(優先級)隊列,保持隊列數據有序,最小值被先取出;
queue模塊中的Queue與multiprocessing模塊的Queue的區別
queue模塊中的Queue:是普通的隊列模式,先進先出模式,get方法會阻塞請求,直到有數據get出來為止,適用于多線程的場景
from threading import Thread, Event from queue import Queue import time def write(q: Queue, e: Event): for value in range(100): print('put {} to queue'.format(value)) q.put(value) time.sleep(0.5) else: e.set() def read(q: Queue, e: Event): while True : if not q.empty() or not e.is_set(): value = q.get() print('get {} from queue'.format(value)) time.sleep(1) else: break if __name__ == '__main__': q = Queue() e = Event() tw = Thread(target=write, args=(q,e)) tr = Thread(target=read, args=(q,e)) tw.start() tr.start() tw.join() tr.join() print('finished ')
multiprocessing模塊的Queue:是多進程并發的Queue隊列,用于解決多進程間的通信問題。
from multiprocessing import Process,Queue, Event import time def write(q: Queue, e: Event): for value in range(100): print('put {} to queue'.format(value)) q.put(value) time.sleep(0.5) else: e.set() def read(q: Queue, e: Event): while True : if not q.empty() or not e.is_set(): value = q.get() print('get {} from queue'.format(value)) time.sleep(1) else: break if __name__ == '__main__': q = Queue() e = Event() pw = Process(target=write, args=(q,e)) pr = Process(target=read, args=(q,e)) pw.start() pr.start() pw.join() pr.join() print('finished ')
qsize()
:返回隊列的大致大小;
empty()
:判斷隊列是否為空,如果隊列為空,返回True,反之False;
full()
:判斷是否滿了;
put()
:將項目放入隊列;
put_nowait
:相當于put(item, False);
get()
:從隊列中刪除并返回一個項目;
get_nowait()
:提供了兩種方法來支持跟蹤守護進程消費者線程是否已完全處理入隊任務;
task_done()
:表示以前排隊的任務已完成;
join()
:阻止直到隊列中的所有項目都已獲取并處理完畢;
from queue import Queue import MySQLdb class ConnectPool: def __init__(self, size=5, *args, **kwargs): if not isinstance(size, int) or size < 1: size = 10 self.__pool = Queue(size) for i in range(size): self.__pool.put(MySQLdb.connect(*args, **kwargs)) @property def connect(self): return self.__pool.get() @connect.setter def connect(self, conn): self.__pool.put(conn) if __name__ == '__main__': # 構建連接池 pool = ConnectPool(host='localhost', user='zengzeng', password='123456', database='XKD_Python_Course', use_unicode=True, charset='utf8') # 獲取一個連接 connect = pool.connect # with connect as cursor: with cursor: sql = 'select * from students' cursor.execute(sql) print(cursor.fetchall())
from queue import Queue import MySQLdb import threading class ConnectPool: def __init__(self, size=5, *args, **kwargs): if not isinstance(size, int) or size < 1: size = 10 self.__pool = Queue(size) for i in range(size): self.__pool.put(MySQLdb.connect(*args, **kwargs)) # 創建一個local對象 self.local = threading.local() @property def connect(self): return self.__pool.get() @connect.setter def connect(self, conn): self.__pool.put(conn) def __enter__(self): if getattr(self.local, 'conn', None) is None: self.local.conn = self.connect return self.local.conn.cursor() def __exit__(self, *exc_info): if exc_info: self.local.conn.rollback() else: self.local.conn.commit() # 將連接對象歸還到連接池 self.connect = self.local.conn # 線程級別的連接對象引用計算器減一 self.local.conn = None if __name__ == '__main__': pool = ConnectPool(host='localhost', user='zengzeng', password='123456', database='XKD_Python_Course', use_unicode=True, charset='utf8') def foo(pool): with pool as cursor: with cursor: # 對cursor做上下文管理 sql = 'select * from students' cursor.execute(sql) print(cursor.fetchall()) for i in range(5): t = threading.Thread(target=foo, args=(pool, )) t.start()
感謝你能夠認真閱讀完這篇文章,希望小編分享的“mysql client如何操作MySQL關系型數據庫”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。