Python進階(2) mysql

0. 前言

  • 安裝MySQL驅動:pip install pymysql
  • 安裝ORM框架:pip install sqlalchemy
  • SQLAlchemy資料:

1. SQLAlchemy 的基本使用

1.1. 創建engine

  • 主要兩個功能:
    1. 構建MySQL的URL,格式爲數據庫類型+數據庫驅動名稱://用戶名:口令@機器地址:端口號/數據庫名
    2. 在URL中處理編碼問題,具體參考 這裏
from sqlalchemy import create_engine

# echo如果爲True,則後續操作會輸出很多日誌,看需求
engine = create_engine("mysql+pymysql://root:[email protected]/db_name?charset=utf8", encoding='utf8', echo=True)

1.2. 創建表映射 & 新建表

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, Float

Base = declarative_base()

# 表結構
class MyTable(Base):
    __tablename__ = 't_table_name'
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(32))
    unit_price = Column(Float)
    address = Column(String(255))
    comment = Column(String(255))

# 新建表
Base.metadata.create_all(engine)

1.3. 建立數據庫記錄實例

record = MyTable(name="XX小區", unit_price=22000.5, address="中山路50號", comment="其他信息")

1.4. 創建會話實例

  • 提供了兩種方式進行操作,下面分別介紹。
  • 使用Session實例,通過ORM或SQL語句的方式操作數據庫。
    • session操作要通過commit提交。在使用完session實例後,要調用close關閉。
# 創建Session實例
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
session = Session()

# Insert操作
# 流程:先建立數據庫記錄實例,再通過`session`的`add`添加一條記錄,通過`add_all`實現批量添加。
record = MyTable(name="XX", unit_price=22000.5, address="50", comment="other")
session.add(record)
session.add_all([MyTable(name="XXX小區", unit_price=3000.5, address="建國路50號", comment="其他信息"),
                MyTable(name="XXXX小區", unit_price=41000.5, address="和平路50號", comment="其他信息"),
                MyTable(name="XXXXX小區", unit_price=13000.5, address="天目山路50號", comment="其他信息")])
session.commit()

# Select操作
# 流程:通過session的`query`獲取查詢結果,對結果通過`filter`篩選,得到數據庫記錄實例。
q = session.query(MyTable)
q = q.filter(MyTable.id==5)
record = q.one()
print(record.id, record.name, record.address, record.comment)

# Update操作
# 流程:先通過Select操作獲取數據庫記錄實例,修改實例變量,再提交。
record.name = 'UPDATE NAME'
session.commit()

# Delete操作
# 流程:先通過Select獲取數據庫實例,再通過`session`的`delete`函數刪除。
session.delete(record)
session.commit()

# 直接執行SQL語句
session.execute('SELECT * FROM t_user')
  • 使用Connection實例,直接通過SQL語句操作數據庫。
# 直接執行sql語句
with engine.connect() as con:
    rs = con.execute('SELECT * FROM t_user')
    data = rs.fetchone()[0]

2. 小功能

2.1. 自動設置 DateTime 相關字段

  • 主要參考這篇博客
  • 注意 onupdate 字段,具體參考下面代碼
from uuid import uuid4
from sqlalchemy import Column, Integer, String, DateTime, Boolean, TIMESTAMP, func
from sqlalchemy.orm import relationship
from sqlalchemy_demo.connect import Base

class UserModule(Base):
    __tablename__ = 'user'

    uuid = Column(String(36), unique=True, nullable=False, default=lambda: str(uuid4()), comment='uuid')
    id = Column(Integer, primary_key=True, autoincrement=True, comment='用戶id')
    user_name = Column(String(30), nullable=False, unique=True, comment='用戶名')
    password = Column(String(64), nullable=False, comment='用戶密碼')
    createtime = Column(DateTime, server_default=func.now(), comment='創建時間')
    # onupdate設置自動更改
    updatetime = Column(DateTime, server_default=func.now(), onupdate=func.now(), comment='修改時間')

3. 實例

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, Float
from sqlalchemy.orm import sessionmaker

MYSQL_URL = "mysql+pymysql://root:[email protected]/db_name?charset=utf8"
MYSQL_ECHO = True  # 如果爲True,則後續操作會輸出很多日誌,看需求

# 創建引擎以及相關內容
engine = create_engine(MYSQL_URL, encoding='utf8', echo=MYSQL_ECHO)
Base = declarative_base()


# 定義表結構(表名、字段)
class MyTable(Base):
    __tablename__ = 't_table_name'
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(32))
    unit_price = Column(Float)
    comment = Column(String(255))


# 新建表
Base.metadata.create_all(engine)


# 通過Session,以ORM的形式來增刪改差
# 創建Session實例
Session = sessionmaker(bind=engine)
session = Session()
# 增
record = MyTable(name="XX", unit_price=22000.5, comment="other")
session.add(record)
session.add_all([MyTable(name="XXX小區", unit_price=3000.5, comment="其他信息1"),
                 MyTable(name="XXXX小區", unit_price=41000.5, comment="其他信息2"),
                 MyTable(name="XXXXX小區", unit_price=13000.5, comment="其他信息3")])
session.commit()
# 查
q = session.query(MyTable)
q = q.filter(MyTable.id==5)
record = q.one()
print(record.id, record.name, record.address, record.comment)
# 改
record.name = 'UPDATE NAME'
session.commit()
# 刪
session.delete(record)
session.commit()
# 通過Session直接執行sql語句
session.execute('SELECT * FROM t_user')


# 通過connection執行sql語句
with engine.connect() as con:
    rs = con.execute('SELECT * FROM t_user')
    data = rs.fetchone()[0]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章