Back to Blogs
python
orm

Python ORM

Soloman
2021-04-11

Python ORM

ORM 即对象关系映射(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),简单来说就是把数据库的一个表映射成程序中的一个对象,表中的每个字段对应程序对象的一个属性,一个表记录对应一个对象实例。

1 Django ORM

  • Each model is a Python class that subclasses django.db.models.Model.
  • Each attribute of the model represents a database field.

models.py -> database

# 为模型的改变生成迁移文件,在本地将模型转换为创建数据库中对应数据表的语句
python manage.py makemigrations

# 应用数据库迁移,执行迁移文件即创建数据表的语句,在数据库中创建对应数据表
python manage.py migrate

database -> models.py

# --database 数据库名 : 要转换的数据库配置别名,对应settings.py文件里的DATABASES数据库配置。当项目配置了两个以上的数据库才要通过 --database,不加–database参数默认就是指向default数据库。
# tablename1 tablename2 : 要转换的数据表名,多个表名之间用空格隔开,如果不加表名参数即是数据库里的全部表
# app_name/models.py : 输出文件
# > :覆盖原文件内容
# >> : 追加内容到原文件之后

python manage.py inspectdb --database databasename tablename1 tablename2 > app_name/models.py
python manage.py inspectdb --database databasename tablename1 tablename2 >> app_name/models.py

# 为默认数据库tablename2表生成模型
python manage.py inspectdb tablename2 > app_name/models.py

# 为默认数据库所有表生成模型
python manage.py inspectdb > app_name/models.py

Django 官方文档

2 SQLAlchemy

安装

pip install SQLAlchemy

models.py -> database

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base

#engine = create_engine("mysql+pymysql://user:password@hostname/dbname?charset=uft8", max_overflow=5)

# echo: 当设置为True时会将orm语句转化为sql语句打印,一般debug的时候可用
# pool_size: 连接池的大小,默认为5个,设置为0时表示连接无限制
# pool_recycle: 设置时间以限制数据库多久没连接自动断开
engine = create_engine(
    "mysql+pymysql://user:password@hostname/dbname?charset=utf8mb4",
    echo=True,
    pool_size=8,
    pool_recycle=60*30
)

Base = declarative_base()
# 创建表,如果存在则忽略
Base.metadata.create_all(engine)

database -> models.py

sqlacodegen mysql+pymysql://username:password@host:port/db_name > orm_filename.py

eg:
sqlacodegen mysql+pymysql://root:123456@127.0.0.1:3306/test > orm_test.py

一般查询公式:

from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
session = Session()

data = session.query(model1, model2)
.join(model2, model1_column==model2_column)
.filter(*args).filter_by(**kwargs)
.order_by(desc(model1.create_time))
.limit(limit).offset(skip).all()

SQLAlchemy官方文档

3 Peewee

  • 一个Model类代表一个数据库的表
  • 一个Field字段代表数据库中的一个字段
  • 一个model类实例化对象则代表数据库中的一行

安装

pip install peewee

models.py -> database

# 先定义Model,然后通过Model.create_table()或db.create_tables()创建表
from peewee import *

# 连接数据库
database = MySQLDatabase(
    'demo', 
    **{'charset': 'utf8', 'use_unicode': True, 'host': 'localhost', 'port': 3306, 'user': 'root', 'password': '123456'}
)

# 定义Person
class Person(Model):
    name = CharField()
    birthday = DateField()
    gender = BooleanField()

    class Meta:
        database = database
        
# 创建表
Person.create_table()
# 也可以这样, 可以创建多个
# database.create_tables([Person])

database -> models.py

python -m pwiz -e mysql -H localhost -p 3306 -u root -P  -t table_names database_name > model.py
选项解释举例
-hhelp显示帮助-h
-eengine数据库引擎,支持sqlite,mysql,postgresql-e mysql
-Hhost数据库地址-H localhost
-pport数据库端口-p 3306
-uuser数据库用户名-u root
-Ppassword数据库密码-P
-sschema模式-s public
-ttables指定生成来自表格-t tablename1, tablename2, tablename3
-vVIEWs指定生成来自视图-v
-iinfo添加原信息-i
-oorder保留表格列顺序-o

Peewee 官方文档

Peewee CN 文档

4 MongoEngine

MongoEngine由Python语言写成,提供一个很类似Django ORM的API 用于访问 MongoDB 数据库。

pip install mongoengine

MongoEngine 官方文档