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
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()
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
| 选项 | 解释 | 举例 |
|---|---|---|
| -h | help显示帮助 | -h |
| -e | engine数据库引擎,支持sqlite,mysql,postgresql | -e mysql |
| -H | host数据库地址 | -H localhost |
| -p | port数据库端口 | -p 3306 |
| -u | user数据库用户名 | -u root |
| -P | password数据库密码 | -P |
| -s | schema模式 | -s public |
| -t | tables指定生成来自表格 | -t tablename1, tablename2, tablename3 |
| -v | VIEWs指定生成来自视图 | -v |
| -i | info添加原信息 | -i |
| -o | order保留表格列顺序 | -o |
4 MongoEngine
MongoEngine由Python语言写成,提供一个很类似Django ORM的API 用于访问 MongoDB 数据库。
pip install mongoengine