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)
Last moify: 2022-12-04 15:11:33
Build time:2025-07-18 09:41:42
Powered By asphinx