单独立使用Django ORM
一、常用的ORM框架简介
在Python下的ORM库不少,同样介绍类似的博文也不少,但是是我非常规的用法,顺便做做笔记。这里参考Python 常用的ORM框架简介文章列出几个, 这个几个我都使用过,但是我还是更喜欢Django ORM, 被它的API惯坏了再也不想使用别的了,于是有种数据库操作都想用它的想法,所以才有了这篇笔记。
Django's ORM是紧嵌到web框架的ORM,一个最流行的Python web框架, 有它独有的ORM。 相比 SQLAlchemy, Django 的 ORM 更吻合于直接操作SQL对象,操作暴露了简单直接映射数据表和Python类的SQL对象, 接口丰富易用 。
优点:易用,学习曲线短 和Django紧密集合,用Django时使用约定俗成的方法去操作数据库
缺点:不好处理复杂的查询,强制开发者回到原生SQL紧密和Django集成,使得在Django环境外很难使用
peewee整个库是单个文件, 看源码费劲(我个人偏见了)
优点:Django式的API,使其易用 轻量实现,很容易和任意web框架集成
缺点:不支持自动化 schema 迁移 多对多查询写起来不直观
SQLAlchemy采用了数据映射模式,其工作单元 主要使得 有必要限制所有的数据库操作代码到一个特定的数据库session,在该session中控制每个对象的生命周期 。
优点:企业级 API,使得代码有健壮性和适应性灵活的设计,使得能轻松写复杂查询
缺点:工作单元概念不常见 重量级 API,导致长学习曲线
二、单独使用Django ORM功能
而这篇笔记的主角是Django 的ORM, 它一般都是在web项目上使用的, 很少有领出来单独使用的,这里就提炼出一个小的Demo 展示独立使用Django ORM, 即非Web项目上使用ORM, 代码目录接口如下:
1.目录结构
│ demox.py
│ main.py
│
├─django_orm
│ │ settings.py
│ │ __init__.py
│ │
│ ├─app01
│ │ │ models.py
│ │ │ __init__.py
2.用代码main.py
在入口处配置Django的设置文件系统环境变量DJANGO_SETTINGS_MODULE值为设置文件的目录django_orm.settings, 这取值跟目录结构有关,加载Django ORM 是读取配和这个配置问文件。
import os
# 行是必须的
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "django_orm.settings")
from django_orm import migrate, make_migrations
from django_orm.app01 import models
from demox import do_demo
import time
import random
import threading
def update():
while True:
try:
obj = models.User.objects.first()
obj.name = obj.name + 1
obj.save()
print("update:", object)
# time.sleep(random.random()*0.5)
except Exception as err:
print("update:", "-" * 40)
print(err)
break
def create():
while True:
try:
obj = models.User.objects.create(name=random.randint(0, 100))
print("create:", obj)
# time.sleep(random.random() * 0.5)
except Exception as err:
print("create:", "-" * 40)
print(err)
def select():
while True:
try:
print("select:", models.User.objects.all()[:5])
# time.sleep(0.5)
except Exception as err:
print("select:", "-" * 40)
print(err)
break
def delete():
while True:
try:
obj = models.User.objects.first()
print("delete:", obj)
obj.delete()
# time.sleep(0.5)
except Exception as err:
print("delete:", "-" * 40)
print(err)
break
if __name__ == '__main__':
do_demo()
make_migrations("app01")
migrate("app01")
u = models.User.objects.create(name=2)
u.save()
print(len(models.User.objects.all()))
# # threading.Thread(target=update).start()
# # threading.Thread(target=create).start()
threading.Thread(target=select).start()
# # threading.Thread(target=delete).start()
3. 应用的models
方便管理创建一个目录django_orm专门放置Django models项目的数据库表结构文件, 目录__init__.py文件中把所有的app加载到Django里, 并提供migrate 和make_migrations方法用于数据库迁移。
from django.apps import apps
from django.conf import settings
from django.core.management import call_command
apps.populate(settings.INSTALLED_APPS)
print("----------apps.populate----------")
def migrate(app_name: str):
call_command("migrate", app_name)
def make_migrations(app_name: str):
call_command("makemigrations", app_name)
settings.py 配置文件,即在main.py 最开始的入口加载的系统环境变量值
# !/usr/bin/env python
# -*- coding: utf-8 -*-
#
# @project : demo2
# @file : settings.py
# @time : 2019/11/8 22:28
# @author : GuangLin
# @version : 0.01
# @desc :
"""
Django settings for demo2 project.
Generated by 'django-admin startproject' using Django 2.1.
For more information on this file, see
https://docs.djangoproject.com/en/2.1/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/2.1/ref/settings/
"""
import os
import sys
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, os.path.join(BASE_DIR, ".."))
print(__file__)
print(BASE_DIR)
print(os.path.join(BASE_DIR, 'db.sqlite3'))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'lyv+won7%7!=ra!nc160o-x1yz+m%n1jxm)wtw_y1r3%shh@-%'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
# Application definition
INSTALLED_APPS = [
'django_orm.app01',
]
# Database
# https://docs.djangoproject.com/en/2.1/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
app01/models.py 应用表结构
from django.db import models
class User(models.Model):
name = models.CharField(max_length=10)
在实践实用中发现Sqlite3在多线程下会锁库,这个是Sqlite内部机制导致的,在Peewee和裸跑多线程也是一样的锁库,特别是配置低的机器下,IO读写速度慢的时候。处理的机制是db操作放到独立的线程下操作,下篇笔记里记录。
单独立使用Django ORM的更多相关文章
- Django框架之第六篇(模型层)--单表查询和必知必会13条、单表查询之双下划线、Django ORM常用字段和参数、关系字段
单表查询 补充一个知识点:在models.py建表是 create_time = models.DateField() 关键字参数: 1.auto_now:每次操作数据,都会自动刷新当前操作的时间 2 ...
- 数据库开发-Django ORM的单表查询
数据库开发-Django ORM的单表查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查询集 1>.查询集相关概述 查询会返回结果的集,它是django.db.mod ...
- python 之 Django框架(orm单表查询、orm多表查询、聚合查询、分组查询、F查询、 Q查询、事务、Django ORM执行原生SQL)
12.329 orm单表查询 import os if __name__ == '__main__': # 指定当前py脚本需要加载的Django项目配置信息 os.environ.setdefaul ...
- Django ORM 之 单表、多表查询
返回ORM目录 Django ORM Django ORM 之一 内容目录: 一.单表查询 二.多表查询 0.准备工作 一些说明: - 表myapp_person的名称是自动生成的,如果你要自定义表名 ...
- Django ORM那些相关操作
一般操作 https://docs.djangoproject.com/en/1.11/ref/models/querysets/ 官网文档 常用的操作 <1> all() ...
- Django ORM那些相关操作zi
Django ORM那些相关操作 一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果 <2> filter(**kwargs) ...
- Django 2.0 学习(16):Django ORM 数据库操作(下)
Django ORM数据库操作(下) 一.增加表记录 对于表单有两种方式: # 方式一:实例化对象就是一条表记录france_obj = models.Student(name="海地&qu ...
- Django ORM --- 建表、查询、删除基础
1.什么是ORM ORM的全称是Object Relational Mapping,即对象关系映射.它的实现思想就是将关系数据库中表的数据映射成为对象,以对象的形式展现,这样开发人员就可以把对数据库的 ...
- Django ORM相关的一些操作
一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 ...
随机推荐
- codeforces 1183F 离散化枚举 约数定理
codeforces1183F 有技巧的暴力 传送门:https://codeforces.com/contest/1183/problem/F 题意: 给你n个数,要你从中选出最多三个数,使得三个数 ...
- 今天IT告告诉我,我电脑上的java jdk属性收费滴!需卸载
敲着代码,IT突然跑来说,你电脑的Jdk版本属于收费版,目前需要卸载!啊哦...手贱!每次有更新我都更新了,Java要收费老早之前耳闻了,但是俺很少做java,一般都在.Net,所以忽略鸟.. 于是G ...
- 安卓中运行报错Error:Execution failed for task ':app:transformClassesWithDexForDebug'解决
在androidstuio中运行我的未完项目,报错: Error:Execution failed for task ':app:transformClassesWithDexForDebug'.&g ...
- 【Linux】一个定时任务小脚本
需要一个定时任务,每隔固定时间停止,等待几分钟,然后在启动,每5分钟一个循环. 简要写了一下,如下,未来在优化: 3,8,13,18,23,28,33,38,43,48,53,58 * * * * s ...
- Python学习(二)语言基础
一.变量与类型 在程序设计中,变量是一种存储数据的载体 整型:Python中可以处理任意大小的整数 浮点型:浮点数也就是小数 字符串型:字符串是以单引号或双引号括起来的任意文本 布尔型:布尔值只有Tr ...
- 牛客练习赛$48E$ 小$w$的矩阵前$k$大元素 堆
正解:堆 解题报告: 传送门$QwQ$ 考虑把$b$从大往小排序,然后把$a_1+b_1,a_2+b_1,...,a_n+b_1$丢到堆里,顺便记录下$b$的下标 然后每次拿出一个最大值,设为$mx= ...
- 配置Mongodb两种方式
手动上传方式 Mongodb-Centos7 安装之前准备工作 下载地址:https://www.mongodb.org/dl/linux 环境说明:下载地址 1系统虚拟机信息:CentOS7 X86 ...
- 深度学习论文翻译解析(六):MobileNets:Efficient Convolutional Neural Networks for Mobile Vision Appliications
论文标题:MobileNets:Efficient Convolutional Neural Networks for Mobile Vision Appliications 论文作者:Andrew ...
- .net core 开车记:Data Protection Key 过期问题与登录页面访问慢
K8s 船还没修好,.net core 车又出了问题,开着 k8s 豪华邮轮.飚着 .net core 极品飞车的好事真是多磨. 自从我们用上 .net core ,就一直被 .net core 的一 ...
- SpringBoot-2.1.1系列一:使用https
1.什么是https? HTTPS中文名称:超文本传输安全协议,是以安全为目标的HTTP通道,简单讲是HTTP的安全版.即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要 ...