Python 資料庫騷操作 -- MySQL

2021-03-02 數據分析1480

閱讀本文大約需要 13 分鐘

目錄

前言

MySQL GUI 工具

MySQL 遇上 Docker

增刪改查

一對多

一對一

多對多

後記

前言

今天這篇是三大資料庫的結尾篇,前面兩篇分別是:《Python 資料庫騷操作 -- MongoDB》《Python 資料庫騷操作 -- Redis》,這篇主要介紹 MySQL 的 orm 庫 SQLAlchemy 。那什麼是 orm 呢?Object Relational Mapper,描述程序中對象和資料庫中數據記錄之間的映射關係的統稱。介紹完了,那就走起唄!

MySQL GUI 工具

首先介紹一款 MySQL 的 GUI 工具 Navicat for MySQL,初學 MySQL 用這個來查看數據真的很爽。可以即時看到數據的增刪改查,不用操作命令行來查看。

Navicat for MySQL
MySQL 遇上 Docker

繼續分享一下 Docker compose 代碼片段,用過 docker 之後,我相信你再也不會為了配置各種開發環境而煩惱了。

version: '3'
services:
  mysql_container:
    image: mysql
    ports:
      - "3306:3306"
    volumes:
      - /usr/local/db/mysql:/var/lib/mysql
#      - /root/docker/test-mysql/conf.d:/etc/mysql/conf.d
    environment:
      - MYSQL_DATABASE=dbname
      - MYSQL_ROOT_PASSWORD=your_password

增刪改查首先定義表結構

# 創建單表
class Users(Base):
    # 表名
    __tablename__ = 'users'
    id = Column(BIGINT, primary_key=True, autoincrement=True)
    # 定義欄位
    name = Column(String(32))
    age = Column(Integer())
# 初始化資料庫
def init_db():
    Base.metadata.create_all(engine)
# 刪除資料庫
def drop_db():
    Base.metadata.drop_all(engine)

連接

from sqlalchemy import create_engine, Column, Integer, String, BIGINT, ForeignKey, UniqueConstraint, Index, and_, or_, inspect
from sqlalchemy.orm import sessionmaker, relationship,contains_eager
# echo 為 True 將會列印 SQL 原生語句
engine = create_engine('mysql+pymysql://username:password@localhost:3306/db_name',echo=True)
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
Session = sessionmaker(bind=engine)
session = Session()

增加

new_user = Users(name='zone', age=18)
session.add(new_user)
# 批量添加
session.add_all([
    User(name='zone2', age=25),
    User(name='zone3', age=32)
])
# 提交
session.commit()


刪除

session.query(User).filter_by(name="zone").delete()
# 提交
session.commit()

修改

session.query(User).filter(User.name == 2).update({"name": "new name"})
session.query(User).filter(User.id >= 3).update({User.name: "關注公眾號【zone7】"}, synchronize_session=False)
session.query(User).filter(User.age == 50).update({"age": 123}, synchronize_session="evaluate")
session.commit()

查找

查找的需求會比較多變,我這邊就列出比較常見的查詢需求。

result = session.query(User).all()   # 結果為一個列表                      
result = session.query(User.id, User.age).all()                    
result = session.query(User).filter_by(name='zone').first()                  
result = session.query(User).filter_by(name='zone2').all()                   
# 與、或                                                                        
result = session.query(User).filter_by(and_(name='zone5',age="23")).all()    
result = session.query(User).filter_by(or_(name='zone5',age="23")).all()     
# 模糊查詢                                                                       
result = session.query(User).filter(User.name.like('zon%')).all()            
# 排序                                                                         
result = session.query(User).order_by(User.age.desc()).all()
# 分頁查詢
result = session.query(User).offset(1).limit(1).all()                 

一對多

關係型資料庫,少不了各種表與表的關係。back_populates 在一對多的關係中建立雙向的關係,這樣的話在對方看來這就是一個多對一的關係。

def one_to_many():
    class Parent(Base):
        __tablename__ = 'parent'
        id = Column(Integer, primary_key=True)
        children = relationship("Child", back_populates="parent")

    class Child(Base):
        __tablename__ = 'child'
        id = Column(Integer, primary_key=True)
        parent_id = Column(Integer, ForeignKey('parent.id'))
        parent = relationship("Parent", back_populates="children")
        name = Column(String(32))

        # 子表類中附加一個 relationship() 方法
        # 並且在(父)子表類的 relationship() 方法中使用 relationship.back_populates 參數

    drop_db()
    init_db()

    child1 = Child(name="zone1")
    child2 = Child(name="zone2")
    parent = Parent(children=[child1, child2])
    session.add(parent)
    session.commit()
    result = session.query(Parent).join(Child).first()
    print(object_as_dict(result.children[0]))

one_to_many()

運行結果

parentchildren一對一

參數 back_populates 指定雙向關係,參數 uselist=False 需要在一對多關係基礎上,父表中使用 uselist 參數來表示。

def one_to_one():
    class Parent(Base):
        __tablename__ = 'parent'
        id = Column(Integer, primary_key=True)
        child = relationship("Child", uselist=False, back_populates="parent")

    class Child(Base):
        __tablename__ = 'child'
        id = Column(Integer, primary_key=True)
        parent_id = Column(Integer, ForeignKey('parent.id'))
        parent = relationship("Parent", back_populates="child")
        name = Column(String(32))

    # 清空資料庫,並且重新初始化
    drop_db()
    init_db()
    child = Child(name="zone")
    parent = Parent(child=child)
    session.add(parent)
    session.commit()

    result = session.query(Parent).join(Child).first()
    print(object_as_dict(result.child))

one_to_one()


parent
child多對多

多對多關係會在兩個類之間增加一個關聯的表來表示其中的關係。這個關聯的表在 relationship() 方法中通過 secondary 參數來表示。通常,這個表會通過 MetaData 對象來與聲明基類關聯。

def many_to_many():
    association_table = Table('association', Base.metadata,
                              Column('left_id', Integer, ForeignKey('left.id')),
                              Column('right_id', Integer, ForeignKey('right.id'))
                              )

    class Parent(Base):
        __tablename__ = 'left'
        id = Column(Integer, primary_key=True,autoincrement=True)
        children = relationship(
            "Child",
            secondary=association_table,
            back_populates="parents")

    class Child(Base):
        __tablename__ = 'right'
        id = Column(Integer, primary_key=True,autoincrement=True)
        name = Column(String(32))
        parents = relationship(
            "Parent",
            secondary=association_table,
            back_populates="children")

    # 清空資料庫,並且重新初始化
    drop_db()
    init_db()

    child1 = Child(name="zone1")
    child2 = Child(name="zone2")
    child3 = Child(name="zone3")

    parent = Parent()
    parent2 = Parent()
    # parent 添加 child
    parent.children.append(child1)
    parent.children.append(child2)
    parent2.children.append(child1)
    parent2.children.append(child2)
    # save
    session.add(parent)
    session.add(parent2)
    session.commit()
    # 查詢
    result = session.query(Parent).first()
    print(object_as_dict(result))
    print(object_as_dict(result.children[1]))
    result2 = session.query(Child).first()
    print(object_as_dict(result2))
    print(object_as_dict(result2.parents[1]))

many_to_many()


第一紅框為 result 第二紅框為 result2後記

回復「mysql」獲取源碼。ok,你有沒有好好練習呢?點擊閱讀原文進入作者的知乎專欄。

相關焦點

  • python對mysql資料庫的操作(一)
    本文章介紹python對mysql資料庫的基本操作,以及編寫一個模擬用戶的註冊。
  • Python 操作MySQL資料庫
    >安裝mysql資料庫並創建號表、欄位。安裝python即pycharm環境。> 第三步:python中使用pymysql連接mysql的庫,安裝命令:pip install pymysql 第四步:查詢數據、插入數據,編寫如下Python代碼:
  • 每天一分鐘,python一點通(Python 連接資料庫mysql)
    mysql資料庫每天一分鐘,python一點通(workbench new table),且建立了一個資料庫表,該如何操作資料庫?  Python 連接資料庫mysql  在操作mysql資料庫前,請先安裝pymysql(pip install pymysql)  import pymysql.cursorsMYSQL_HOSTS='localhost' # 本地資料庫,若是伺服器上的資料庫,請輸入伺服器IPMYSQL_USER
  • Python連接MySQL資料庫方法介紹(超詳細!手把手項目案例操作)
    執行結果如下:('a', '趙大', '16')('b', '錢二', '16')mysql.connectormysql-connector-python:是MySQL官方的純Python驅動;mysql.connector
  • python是如何來連接mysql的
    就像Java連MySQL使用jdbc驅動器一樣,python的標準數據接口Python DB-API為開發人員提供了資料庫應用編程接口,可以支持很多種資料庫,今天我們以mysql為例來介紹python如何操作資料庫。
  • 成長記(一)教你如何用Python操作MySQL
    >>> import pymysql>>>看到這個畫面就說明下載成功了,接下來學習如何操作資料庫了!!!對數據進行查詢代碼解讀:· cursor():這個是光標,用來執行mysql語句的,用完後也是需要關閉的· excute():這個是執行語句,執行參數的mysql語句
  • day06-python資料庫-mysql之安裝
    但每臺機器上的組件都只能操作本機的文件,這就導致了數據必然不一致。於是我們想到了將數據與應用程式分離:把文件存放於一臺機器,然後將多臺機器通過網絡去訪問這臺機器上的文件,即共享這臺機器上的文件,共享則意味著競爭,會發生數據不安全,需要加鎖處理。
  • MYSQL資料庫操作案例
    MySQL 創建資料庫CREATE DATABASE 資料庫名;以下命令簡單的演示了創建資料庫的過程,數據名為 RUNOOB:[root@host]# mysql -u root -p >Enter password:****** # 登錄後進入終端mysql> create DATABASE RUNOOB;MySQL 刪除資料庫drop database <資料庫名>;
  • 如何使用PyMySQL操作mysql資料庫?
    ,比如MySQL,這裡我來分享下簡單的Python操作MySQL的庫pymysql。適用環境python版本 >=2.6或3.3mysql版本>=4.1安裝可以使用pip安裝也可以手動下載安裝。
  • Python開發之:Django基於Docker實現Mysql資料庫讀寫分離、集群、主從同步詳解 | 原力計劃
    讀寫分離,基本的原理是讓主資料庫處理事務性增、改、刪操作(INSERT、UPDATE、DELETE),而從資料庫處理SELECT查詢操作。
  • 一看就會,MySQL資料庫的基本操作(四)
    打開命令:net start mysql;關閉命令:net stop mysql打開、關閉資料庫命令2、登陸資料庫命令:mysql -h 主機地址 -u 用戶名 -p 用戶密碼。退出命令:exit添加資料庫用戶的操作如果xiaoli這個用戶操作network這個資料庫沒有有密碼可以用這個命令:grant select,insert,update
  • MySQL資料庫操作語法詳解
    create_specification中指定了創建資料庫特性。資料庫特性存放在資料庫目錄下的db.opt文件中,一般在資料庫安裝目錄的data/db_name/子目錄下。CHARACTER SET子句指定了資料庫默認的字符集,COLLATE子句指定了資料庫默認校對。
  • 「技術文章」《Python 資料庫 GUI CGI編程》
    1.寫在前邊上一次,我們介紹了Python的入門的文章,今天我們就來介紹下Python的資料庫,GUI, CGI的編程,以及Python 2.x 與Python 3.x的區別。2.連接資料庫 Python 標準資料庫接口為 Python DB-API,MySQLdb 是用於Python連結Mysql資料庫的接口。
  • MySQL資料庫的分組操作,語句拼接,列轉行操作
    本文介紹MySQL資料庫的分組操作,語句拼接,列轉行操作。select @@sql_mode;在帶有group by 子句的select中,select後的條件列(非主鍵列),要麼是group by 後面的列,要麼需要在函數中示例group by 錯誤select user,host from mysql.user
  • MySQL教程之MySQL定時備份資料庫
    一、MySQL數據備份1.1、 mysqldump命令備份數據在MySQL中提供了命令行導出資料庫數據以及文件的一種方便的工具mysqldump,我們可以通過命令行直接實現資料庫內容的導出dump,首先我們簡單了解一下mysqldump命令用法:
  • ubuntu18.04 django 連接 mysql 資料庫方法和常見錯誤總結
    本人電腦系統 ubuntu18.04 , django版本 2.2在ubuntu電腦使用django連接mysql資料庫的時候遇到了一些問題
  • 如何使用MySQL資料庫
    一、訪問MySQL資料庫1.登錄到MySQL伺服器經過安裝後的初始化,MySQL資料庫默認管理員用戶名為root,密碼為空。若要以未設置密碼的root用戶登錄本機的MySQL資料庫,可執行以下操作:上面是沒密碼登錄,那麼如何設置資料庫用戶的密碼呢?在linux命令環境中,一般使用mysqladmin工具來設置密碼。
  • 考前複習必備MySQL資料庫(關係型資料庫管理系統)
    利用mysql命令方式啟動資料庫:按windows+r組合鍵,打開窗口,進入命令行;使用cd命令進入mysql目錄;輸入bin\mysqld,啟動mysql服務。啟動資料庫使用bin\mysql -u root -p命令進入mysql操作環境中。服務圖片,開啟資料庫:
  • Mysql資料庫update操作死鎖問題分析
    基於以上前提,我發現近期經常會報出一些資料庫操作失敗的錯誤,列印出mysql錯誤日誌如下:1213 Deadlock found when trying to get lock; try restarting transaction即觸發了mysql的死鎖錯誤。
  • MySQL資料庫及應用
    SHOWDATABASE;答案: C3 單選 關於資料庫的執行操作,_____________選項是錯誤的。A. SHOWDATABASES語句用於查詢當前資料庫系統中已經存在的資料庫B.Document.Write("HelloWorld");D. write(「HelloWorld」);5 單選 連接 MySQL 資料庫的正確方法是A. mysql_open("localhost");B. mysql_connect("localhost