SqlAlchemy 是一个 ORM 框架。
连接数据库
连接数据库的方式为:
import sqlalchemy
from sqlalchemy.orm import sessionmaker
engine = sqlalchemy.create_engine("sqlite:///data.db")
Session = sessionmaker(bind=engine)
此后,每次进行操作都应当创建一个新的 Session:
session = Session()
# 插入或删除数据
try:
session.commit()
except Exception as _:
session.rollback()
创建映射
在创建映射之前,需要创建一个基类对象:
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
一个数据库映射形式如下:
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True, autoincrement=True)
username = Column(String(30), unique=True, nullable=False)
password = Column(String(50), nullable=False)
mobile = Column(String(11), nullable=False)
email = Column(String(50), nullable=False)
create_time = Column(DateTime, default=datetime.datetime.now)
如果需要外键和唯一约束,则为:
class User2Role(Base):
__tablename__ = "userrole"
id = Column(Integer, primary_key=True, autoincrement=True)
rid = Column(Integer, ForeignKey("role.id"))
uid = Column(Integer, ForeignKey("users.id"))
__table_args__ = (UniqueConstraint("rid", "uid"),)
查询数据
最简单的查询方式为:
users: User = session.query(User).all()
过滤数据
可以在 query 后调用 filter_by 来过滤数据。
过滤数据
new_user = session.query(mapping.User).filter_by(
username=user.username
).first() or abort(500)
表连接
可以使用 join 对表进行连接:
id, username, mobile, email, rid = session.query(
User.id, User.username, User.mobile, User.email, User2Role.rid
).join(User2Role, User.id == User2Role.uid).filter_by(
username=username, password=password
).first() or abort(
403
)
添加数据
添加数据只是简单地调用 add 函数:
session = Session()
user = mapping.User(
username=username,
password=password,
email=email,
mobile=mobile,
)
session.add(user)
try:
session.commit()
except Exception as _:
session.rollback()
删除数据
删除数据之前首先需要将数据查出来:
user = session.query(mapping.User).filter_by(id=userid).first()
if user is not None:
session.delete(user)
try:
session.commit()
except Exception as _:
abort(500)