0. 前言
- 安裝MySQL驅動:
pip install pymysql
- 安裝ORM框架:
pip install sqlalchemy
- SQLAlchemy資料:
1. SQLAlchemy 的基本使用
1.1. 創建engine
- 主要兩個功能:
- 構建MySQL的URL,格式爲
數據庫類型+數據庫驅動名稱://用戶名:口令@機器地址:端口號/數據庫名
- 在URL中處理編碼問題,具體參考 這裏。
from sqlalchemy import create_engine
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
關閉。
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
session = Session()
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()
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.execute('SELECT * FROM t_user')
- 使用Connection實例,直接通過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='創建時間')
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
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 = 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.execute('SELECT * FROM t_user')
with engine.connect() as con:
rs = con.execute('SELECT * FROM t_user')
data = rs.fetchone()[0]