SQLaichemy三种排序方式

一、介绍

SQLALchemy也是一个python的ORM框架,django内部的ORM框架只适用于django,而SQLALchemy适用于所有python的web框架

SQLAlchemy是一个基于Python实现的ORM框架。该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使用数据API执行SQL并获取执行结果。
在这里插入图片描述
SQLAlchemy本身无法操作数据库,其必须以来pymsql等第三方插件,Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作

  • List item

  • Engine,框架的引擎

  • Connection Pooling ,数据库连接池

  • Dialect,选择连接数据库的DB API种类

  • Schema/Types,架构和类型

  • SQL Exprression Language,SQL表达式语言

  • DBAPI,也就是pymysql或者MySQLdb模块

总体流程:类和对象的操作转换为SQL语句交给框架引擎,引擎去数据库连接池拿连接。从Dialect获取用哪个模块,然后调用DBAPI中对应的模块,利用模块去真正的数据库中做操作

二、三种排序使用

  1. order_by:可以指定根据这个表中的某个字段进行排序,如果在前面加了一个-,代表的是降序排序。

  2. 在模型定义的时候指定默认排序:有些时候,不想每次在查询的时候都指定排序的方式,可以在定义模型的时候就指定排序的方式。有以下两种方式:
    在模型定义中,添加以下代码:
    mapper_args = {
    “order_by”: num.desc()
    }
    正序排序与倒序排序:默认是使用正序排序。如果需要使用倒序排序,那么可以使用这个字段的desc()方法,或者是在排序的时候使用这个字段的字符串名字,然后在前面加一个负号。

  3. relationship的order_by参数:在指定relationship的时候,传递order_by参数来指定排序的字段。

笔者在过程中发现,使用__mapper_args__ 时候如果python环境大于python3.7的话,就会报错TypeError: init() got an unexpected keyword argument ‘order_by’,所以在使用过程中请注意自己的python环境,具体原因笔者现在还在研究,如果有收获,会更新文章。


```python
from datetime import datetime

from sqlalchemy.orm import session

from sqlalchemy import create_engine, Column, Integer, String, Float, Text, ForeignKey, DateTime
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relationship, backref

host = '10.121.121.241'
port = '3306'
database = 'db_to_sqlalchemy'
username = 'root'
password = '123456'

DB_URI = f'mysql+pymysql://{username}:{password}@{host}:{port}/{database}'

engine = create_engine(DB_URI)  # 创建引擎
Base = declarative_base(engine)  # 使用declarative_base创建基类
session = sessionmaker(engine)()


class Article(Base):
    __tablename__ = 'article'
    id = Column(Integer, primary_key=True, autoincrement=True)
    title = Column(String(50), nullable=False)
    create_time = Column(DateTime, nullable=False, default=datetime.now)
    num = Column(Integer, default=0, nullable=False)
    author = relationship("Article",backref=backref("articles", order_by=num .desc()))
    # __mapper_args__ = {
    #     "order_by": num.desc()
    # }

    def __repr__(self):
        return f'title: {self.title}、create_time: {self.create_time}、num: {self.num}'


# Base.metadata.drop_all()  # 删除所有表
# Base.metadata.create_all()  # 创建表

# article1 = Article(title='title1',num=7)
# session.add(article1)
# session.commit()
# time.sleep(1)
# article2 = Article(title='title2',num=2)
# session.add(article2)
# session.commit()
# time.sleep(1)
# article2 = Article(title='title3',num=4)
# session.add(article2)
# session.commit()
# time.sleep(1)
# article2 = Article(title='title4',num=19)
# session.add(article2)
# session.commit()

# article = session.query(Article).order_by(Article.num.desc()).all()
# print(article)


article = session.query(Article).all()
print(article)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值