美文网首页
Sqlalchemy ORM

Sqlalchemy ORM

作者: 白鬓少年 | 来源:发表于2020-07-27 12:21 被阅读0次

    本文主要Sqlalchemy的ORM components进行介绍
    参考:SQLAlchemy 1.4 Documentation(中文版)

    基本架构

    SQLAlchemy由几个组件组成,包括SQL expression language和ORM。
    为了实现这些组件,SQLAlchemy还提供了一个Engine类和MetaData类。

    • Engine--管理SQLAlchemy连接池和独立于数据库的SQL方言层。
    • MetaData - 用于收集和组织有关您的表布局(数据库模式)的信息。
    • SQL expression language--提供了一个API来对你的表执行查询和更新。
      所有这些都来自Python,而且都是以一种独立于数据库的方式。(本文不作介绍)
    • ORM - 提供了一种方便的方式来为你的Python对象添加数据库持久性,而不需要再添加其他的功能。

    ORM创建表格

    from sqlalchemy import create_engine, Column, Integer, String
    from sqlalchemy.ext.declarative import declarative_base
    
    
    # 建立一个引擎对象,如果数据库不存在,将创建数据库,下面以sqlite为例
    engine = create_engine("sqlite:///test.db", echo=True)
    # 创造基类的实例,通常只会有一个实例,建议做单例模式
    Base = declarative_base(bind=engine)
    
    
    class Customers(Base):
        """在Base的基础上定义映射类
    
        Args:
            Base : 基类
        """    
        __tablename__ = 'customers'
    
        id = Column(Integer, primary_key=True)
        name = Column(String)
        address = Column(String)
        email = Column(String)
    
    
    def create_table():
        """创建还没有被创建的表
        """    
        Base.metadata.create_all() 
    

    获取交互句柄

    from sqlalchemy import create_engine
    from sqlalchemy.orm import sessionmaker
    
    engine = create_engine("sqlite:///test.db", echo=True)
    
    def get_session():
        """获取与数据库交互的句柄
    
        Returns:
            与数据库交互的句柄
        """    
        Session = sessionmaker(bind=engine)
        session = Session()
        return session
    
    

    数据库操作

    以新增customer为例

    def add_customer(**kwargs):
        c = Customers(**kwargs)
        session = get_seesion()
        session.add(c)
        session.commit()
        session.close()
        return c
    
    add_customer(name='xiaofan', address='xiaozhufeng', email='xiaofan@163.com')
    
    其它常用操作
    • add_all()
    • query()
    session.query(Customers).all()  # return list
    
    session.query(Customers).first()  # return scalar
     # 超过一个报错“MultipleResultsFound”, 少于一个报错“NoResultFound”
    session.query(Customers).filter(Customers.id == 1).one()   # retrun scalar
    
    
    • filter()
    # return list
    session.query(Customers).filter(Customers.name=='yasin')  # ==
    session.query(Customers).filter(Customers.id>2)  # >
    session.query(Customers).filter(Customers.name.like('Ra%'))  # like
    session.query(Customers).filter(Customers.id.in_([1,3]))  # in
    session.query(Customers).filter(Customers.id>2,
    Customers.name.like('Ra%'))  # and
    session.query(Customers).filter(and_(Customers.id>2,
    Customers.name.like('Ra%')))  # and
    session.query(Customers).filter(or_(Customers.id>2,
    Customers.name.like('Ra%')))  # or
    
    • scalar()
    session.query(Customers).filter(Customers.id==3).scalar()  # 仅当len(list)=1时有效
    
    • update()
    session.query(Customers).filter(Customers.id!=2).update({Customers.name:"Mr."+C
    ustomers.name}, synchronize_session=False)
    

    Textual SQL

    • filter中使用SQL查询语句
    from sqlalchemy import text
    
    session.query(Customers).filter(text("id<3"))
    session.query(Customers).filter(text("id=:value")).params(value=1).one()
    
    • 纯SQL语句查询
    session.query(Customers).from_statement(text("SELECT * FROM customers")).all()
    
    stmt = text("SELECT name, id, name, address, email FROM customers")
    # name, id 对应链接到了Customers.id和Customers.name,互换了
    stmt=stmt.columns(Customers.id, Customers.name) 
    session.query(Customers.id, Customers.name).from_statement(stmt).all()
    

    相关文章

      网友评论

          本文标题:Sqlalchemy ORM

          本文链接:https://www.haomeiwen.com/subject/wshglktx.html