一、介绍
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中对应的模块,利用模块去真正的数据库中做操作
二、三种排序使用
-
order_by:可以指定根据这个表中的某个字段进行排序,如果在前面加了一个-,代表的是降序排序。
-
在模型定义的时候指定默认排序:有些时候,不想每次在查询的时候都指定排序的方式,可以在定义模型的时候就指定排序的方式。有以下两种方式:
在模型定义中,添加以下代码:
mapper_args = {
“order_by”: num.desc()
}
正序排序与倒序排序:默认是使用正序排序。如果需要使用倒序排序,那么可以使用这个字段的desc()
方法,或者是在排序的时候使用这个字段的字符串名字,然后在前面加一个负号。 -
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)