美文网首页
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