SQLAlchemy 各种极大便利的骚操作

🤖 Assistant

除了基础功能和 TypeDecorator,SQLAlchemy 还有很多非常实用和便捷的功能,可以提升开发效率、增强代码可维护性,并简化数据库操作。 这里列举一些常用的功能点:

1. 关系映射 (Relationships):

  • SQLAlchemy 强大的关系映射功能可以轻松处理表之间的关系 (一对一、一对多、多对多)。 避免手动编写 JOIN 查询和复杂的对象关系处理。
from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class Parent(Base):
    __tablename__ = 'parent'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    children = relationship("Child", back_populates="parent") # # 一对多关系

class Child(Base):
    __tablename__ = 'child'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    parent_id = Column(Integer, ForeignKey('parent.id'))# 外键关联
    parent = relationship("Parent", back_populates="children")# 反向引用关系

engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()

#CRUD, 可以方便的从parent找到所有child,也可以反向从Child找到Parent,而不需要自己写join语句。
  • back_populates参数能够自动维护反向关系,使得对象之间的导航更加自然。

2. 混合属性 (Hybrid Attributes):

  • hybrid_propertyhybrid_method 允许你定义可以在实例级别和类级别使用的属性和方法。 这对于处理需要在 SQL 查询中使用的计算属性非常有用。
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.ext.hybrid import hybrid_property

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    firstname = Column(String)
    lastname = Column(String)

    @hybrid_property
    def fullname(self):
        return self.firstname + " " + self.lastname

    @fullname.expression #定义查找逻辑
    def fullname(cls):
        return cls.firstname + " " + cls.lastname

#可以通过User.fullname进行查找。

3. 监听事件 (Events):

  • SQLAlchemy 的事件监听器允许你在数据库操作的不同阶段执行自定义的操作,例如在插入、更新、删除数据前后执行某些操作。 可以用来实现审计日志、数据验证、缓存更新等。
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy import event
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class MyTable(Base):
    __tablename__ = 'mytable'
    id = Column(Integer, primary_key=True)
    data = Column(String)



# 监听 before_insert 事件
@event.listens_for(MyTable, 'before_insert')
def before_insert_listener(mapper, connection, target):
    print("before insert event triggered")
    target.data = target.data.lower()#自动将传入值转为lower

# 增删改操作

4.表达式语言(Expression Language):

  • 构建查询不仅仅依靠原始SQL,而可以使用 SQLAlchemy 提供的表达式语言来构建查询。这样的查询更易读、易维护,并能更好地适应不同数据库。
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import and_, or_

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    age = Column(Integer)

engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()

# 构建复杂的查询条件
query = session.query(User).filter(
    and_(User.age > 18, or_(User.name == 'Alice', User.name == 'Bob'))
) #查找age > 18 并且 name == 'Alice' 或者name == 'Bob'

5. 自动加载 (Autoload):

  • 如果你的数据库已经存在,并且你想使用 SQLAlchemy 来操作它,可以使用 autoload 功能自动从数据库加载表的结构。
from sqlalchemy import create_engine, MetaData, Table
from sqlalchemy.orm import sessionmaker

engine = create_engine('mysql://user:password@host/database')
metadata = MetaData()

# 从数据库自动加载 users 表的结构
users_table = Table('users', metadata, autoload_with=engine)

Session = sessionmaker(bind=engine)
session = Session()

# 现在可以使用 users_table 进行查询操作

6. JSON Support (针对支持 JSON 的数据库):

  • 对于支持 JSON 数据类型的数据库(如 PostgreSQL),SQLAlchemy 提供了专门的 JSON 类型,可以方便地存储和查询 JSON 数据。
from sqlalchemy import create_engine, Column, Integer
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy.dialects.postgresql import JSONB

Base = declarative_base()

class MyTable(Base):
    __tablename__ = 'mytable'
    id = Column(Integer, primary_key=True)
    data = Column(JSONB)

engine = create_engine('postgresql://user:password@host/database')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
session.add()

7. 事务管理 (Transactions):

  • 事务管理提供了确保数据库操作原子性、一致性、隔离性和持久性(ACID)的能力。
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    age = Column(Integer)

engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()

try:
    # 事务开始
    user1 = User(name='Alice', age=30)
    session.add(user1)
    session.commit()# 提交, 此时数据已被持久化

except Exception as e:
    session.rollback()#回滚,撤销之前的操作
finally:
     session.close()

8. Alembic for Migrations:

  • Alembic 是一个 SQLAlchemy 官方推荐的数据库迁移工具, 能够以安全可控的方式修改数据库结构.

以上只是一些比较常用的功能,SQLAlchemy 提供了丰富的功能集,可以满足各种不同的数据库应用场景。 要深入了解 SQLAlchemy 的更多功能,请阅读 SQLAlchemy 官方文档。

posted on 2025-08-22 01:27  痴心妄想  阅读(20)  评论(0)    收藏  举报

导航