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_property和hybrid_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 官方文档。
浙公网安备 33010602011771号