中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

mysql client如何操作MySQL關系型數據庫

發布時間:2022-01-05 17:06:37 來源:億速云 閱讀:178 作者:小新 欄目:編程語言

這篇文章主要介紹了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數據庫已經存在了

mysql client如何操作MySQL關系型數據庫

  • 然后我們可以使用命令行: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

mysql client如何操作MySQL關系型數據庫

  • 然后可以通過命令行:show create table students;,查看一下創建表的創建;

mysql client如何操作MySQL關系型數據庫

  • 還可以通過命令行:desc students;,查看表的結構;

mysql client如何操作MySQL關系型數據庫

  • 此時我們已經創建好了數據庫和數據庫表,然后我們需要授權用戶,設置密碼,授權成功之后一定要記得刷新權限;

grant all on XKD_Python_Course.* to 'zengzeng'@'%' identified by '123456';
# 刷新權限
flush privileges;
  • 授權后我們可以退出,然后登錄我們剛剛授權的用戶:mysql -uzengzeng -p123456,就可以成功登錄,登錄后可以show databases;查看一下剛剛創建的數據庫

mysql client如何操作MySQL關系型數據庫

  • 然后我們可以看到里面有兩個數據庫,如果我們想操作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;,是不是發現表中多了一條數據啊;

mysql client如何操作MySQL關系型數據庫

  • 批量插入數據,就是在插入數據的地方增加一個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()

mysql client如何操作MySQL關系型數據庫

  • 查詢數據,查詢結果的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()

mysql client如何操作MySQL關系型數據庫

cursor
  • cursor是游標對象,用于執行查詢和獲取結果;

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類中實現了所有需要的鎖原語,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 ')
Queue隊列對象的方法
  • qsize():返回隊列的大致大小;

  • empty():判斷隊列是否為空,如果隊列為空,返回True,反之False;

  • full():判斷是否滿了;

  • put():將項目放入隊列;

  • put_nowait:相當于put(item, False);

  • get():從隊列中刪除并返回一個項目;

  • get_nowait():提供了兩種方法來支持跟蹤守護進程消費者線程是否已完全處理入隊任務;

  • task_done():表示以前排隊的任務已完成;

  • join():阻止直到隊列中的所有項目都已獲取并處理完畢;

使用Queue構建連接池
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關系型數據庫”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阳城县| 门源| 高唐县| 陆川县| 陆良县| 平乡县| 泰兴市| 南召县| 荥阳市| 克山县| 阜宁县| 北安市| 邻水| 西乌珠穆沁旗| 柞水县| 武义县| 龙岩市| 宜州市| 铜川市| 淳化县| 夏河县| 新源县| 苗栗市| 巴楚县| 天水市| 台北县| 自治县| 云南省| 巫山县| 海伦市| 江达县| 闽侯县| 洮南市| 容城县| 廉江市| 靖宇县| 贵州省| 南京市| 隆林| 福建省| 民丰县|