- import pymysql
- pymysql.version_info = (1, 4, 13, "final", 0)
- pymysql.install_as_MySQLdb()
- # Database
- # https://docs.djangoproject.com/en/4.2/ref/settings/#databases
-
- DATABASES = {
- 'default': {
- 'ENGINE': 'django.db.backends.mysql',
- 'NAME': 'pmms', # 数据库名称
- 'HOST': '127.0.0.1', # 数据库地址,本机 ip 地址 127.0.0.1
- 'PORT': 3306, # 端口
- 'USER': 'root', # 数据库用户名
- 'PASSWORD': 'BuNengGaoSuNi', # 数据库密码
- }
- }
ORM(Object Relational Mapping)即对象关系映射,它是一种程序技术,允许你使用类和对象对数据库进行操作,从而避免通过SQL语句操作数据库。
- from django.db import models
-
-
- # Create your models here.
- class AbilityScore(models.Model):
- index = models.AutoField(db_column="Index", auto_created=True, primary_key=True)
- employee_id = models.CharField(db_column="EmployeeID", max_length=10, default='')
- ability = models.ForeignKey(to='ability_standard.AbilityStandard', on_delete=models.CASCADE,
- db_column="AbilityID", default=None)
- approved_value = models.CharField(db_column="ApprovedValue", max_length=2, default='')
- upcoming_value = models.CharField(db_column="UpcomingValue", max_length=2, default='')
- create_time = models.DateTimeField(db_column="CreateTime", auto_now_add=True)
- update_time = models.DateTimeField(db_column="UpdateTime", auto_now=True)
-
- class Meta:
- managed = True
- db_table = 'ability_score'
- constraints = [
- models.UniqueConstraint(fields=['employee_id', 'ability_id'], name='unique_employee_id_ability_id')
- ]
使用内部Meta类来给模型赋予属性,Meta类下有很多内建的类属性,可对模型来做一些控制。
用于控制表的属性,如表名。改了Meta类也要makemigrations migrate
但凡模型类发生变化都要makemigrations migrate
- class Meta:
- db_table = 'ability_score'
migration 文件不要在代码里追踪。
ORM CRUD核心->模型类自带的管理器对象
管理器对象:每个继承自Models.Model的模型类,都会有一个objects对象同样被继承下来,即管理器对象。
数据库的增删改查可以通过模型的管理器实现
- class MyModel(models.Model):
- ...
- MyModel.objects.create(...) # objects 即管理器对象
在Django提供了一个交互式的操作项目叫Django Shell它能够在交互模式用项目工程的代码(如数据的连接配置和已有的model类),加载当前的项目环境,执行相应的操作。
利用Django Shell可以代替编写view的代码来进行直接操作
注意:项目代码发生变化时,重新进入Django Shell
启动方式:python3 manage.py shell
- python.exe .\manage.py shell
- Python 3.9.0 (tags/v3.9.0:9cf6752, Oct 5 2020, 15:23:07) [MSC v.1927 32 bit (Intel)] on win32
- Type "help", "copyright", "credits" or "license" for more information.
- (InteractiveConsole)
- >>>
Django ORM使用一种直观的方式把数据库表中的数据表示成Python对象。
创建数据中每一条记录就是创建一个数据对象
MyModel.objects.create(属性1=值1, 属性2=值2, ...)
- models.AbilityScore.objects.create(employee_id=employee_id, ability_id=ability_id,
- upcoming_value=upcoming_value)
成功:返回创建好的实体对象
失败:抛出异常
- obj = MyModel(属性1=值1,属性2=值2)
- obj.属性=值
- obj.save()
| 管理器方法 | 说明 | 用法 |
| all() | 查询全部记录,返回QuerySet查询对象 | MyModel.objects.all() select * from table |
| get() | 查询符合条件的单一记录 | |
| filter() | 查询符合条件的多条记录 | |
| exclude() | 查询符合条件之外的全部记录 | |
| ... |
- python.exe .\manage.py shell
- Python 3.9.0 (tags/v3.9.0:9cf6752, Oct 5 2020, 15:23:07) [MSC v.1927 32 bit (Intel)] on win32
- Type "help", "copyright", "credits" or "license" for more information.
- (InteractiveConsole)
- >>> from ability_score.models import AbilityScore
- >>> AbilityScore.objects.order_by('-upcoming_value')
object (1)>, object (2)>]> - >>> a = AbilityScore.objects.order_by('-upcoming_value')
- >>> for item in a:
- ... print(item.ability_id, item.upcoming_value)
- ...
- 1 4
- 2 2
- >>>
- >>> all = AbilityScore.objects.all()
- >>> items = all.order_by('upcoming_value')
- >>> for item in items:
- ... print(item.ability_id, item.upcoming_value)
- ...
- 2 2
- 1 4
- >>>
- >>> print(all.query)
- SELECT `ability_score`.`Index`, `ability_score`.`EmployeeID`, `ability_score`.`AbilityID`, `ability_score`.`ApprovedValue`, `ability_score`.`Upcomi
- ngValue`, `ability_score`.`CreateTime`, `ability_score`.`UpdateTime` FROM `ability_score`
- >>> print(items.query)
- SELECT `ability_score`.`Index`, `ability_score`.`EmployeeID`, `ability_score`.`AbilityID`, `ability_score`.`ApprovedValue`, `ability_score`.`Upcomi
- ngValue`, `ability_score`.`CreateTime`, `ability_score`.`UpdateTime` FROM `ability_score` ORDER BY `ability_score`.`UpcomingValue` ASC
- >>> for item in items:
- ... print(item.query)
- ...
- Traceback (most recent call last):
- File "
" , line 2, in - AttributeError: 'AbilityScore' object has no attribute 'query'
- >>>
if models.AbilityScore.objects.filter(employee_id=employee_id, ability_id=ability_id): - employee_ability = models.AbilityScore.objects.get(employee_id=employee_id, ability_id=ability_id)
- if employee_ability.upcoming_value != str(upcoming_value):
- employee_ability.upcoming_value = upcoming_value
- employee_ability.save()
- Authors.objects.filter(id__exact=1)
- # 等同于select * from author where id = 1
- Author.objects.filter(name__contanins='w')
- # 等同于 select * from author where name like '%w%'
- Author.objects.filter(age__gt=50)
- # 等同于 select * from author where age > 50
- Author.objects.filter(country__in=['中国','日本','韩国'])
- # 等同于 select * from author where country in ('中国','日本','韩国')
- Author.objects.filter(age__range=(35,50))
- # 等同于 SELECT ... WHERE AGE BETWEEN 35 AND 50;
employee_ability = models.AbilityScore.objects.get(employee_id=employee_id, ability_id=ability_id)
employee_ability.upcoming_value = upcoming_value
employee_ability.save()
- # 将 id大于3的所有图书价格定位0元
- books = Book.objects.filter(id__gt=3)
- books.update(price=0)
- # 将所有书的零售价定为100元
- books = Book.objects.all()
- books.update(market_price=100)
- try: # 防止没查到 get 太硬报异常
- auth = author.objects.get(id=1)
- auth.delete()
- except:
- print('删除失败')
- # 删除全部作者中,年龄大于65的全部信息
- auths = Author.objects.filter(age__gt=65)
- auths.delete()
book = Book.objects.get(id=book_id, is_active=True) - from django.db.models import F
- F('列对应的类属性名')
- Book.objects.all().update(market_price = F('market_price') + 10)
- '''
- 转化为的SQL语句
- UPDATE `bookstore_book` SET `market_price` = (`bookstore_book`.`market_price` + 10)
- '''
- # 以上做法好于如下代码
- books = Book.objects.all()
- for book in books:
- book.market_price = book.marget_price + 10
- book.save()
- from django.db.models import F
- from boookstore.models import Book
- books = Book.objects.filter(market_price__gt=F('price'))
- '''
- SELECT * FROM `bookstore_book`
- WHERE `bookstore_book`.`market_price` > (`bookstore_book`.`price`)
- '''
- for book in books:
- print(book.title, '定价:', book.price, '现价:', book.market_price)
- from django.db.models import Q
- Book.objects.filter(Q(price__lt=20) | Q(pub='清华大学出版社'))
- from django.db.models import Q
-
-
- # 查找清华大学出版社的书或价格低于50的书
- Book.objects.filter(Q(pub_house='清华大学出版社')|Q(market_price__lt=50))
-
-
- #查找不是机械工业出版社且价格低于50的书
- Book.objects.filter(Q(market_price__lt=50) & ~Q(pub_house='机械工业出版社'))
聚合查询是指对一个数据表中的一个字段的数据进行部分或全部统计查询.
- from django.db.models import Count
-
-
- Book.objects.aggregate(res=Count('id))
- # 返回: {'res':4}
- pub_set = Book.objects.values('pub')
- print(pub_set)
- '''
- {'pub':'清华大学出版社'},
- {'pub':'清华大学出版社'},
- {'pub':'机械工业出版社'},
- {'pub':'清华大学出版社'}
- ]>
- '''
- pub_count_set = pub_set.annotate(myCount=Count('pub'))
- print(pub_count_set)
- '''
- {'pub':'清华大学出版社', 'myCount':3},
- {'pub':'机械工业出版社', 'myCount':1}
- ]>
- '''
仅支持查询操作
- books = models.Book.objects.raw('select * from bookstore_book')
- for book in books:
- print(book)
from django.db import connection
with connection.cursor() as cur:
cur.execute('执行SQL语句', '拼接参数')
- # 用SQL语句将id为10的书的出版社更改为"XXX出版社"
- from django.db import connection
-
-
- with connection.cursor() as cur:
- cur.execute('update bookstore_book set pub_house="XXX出版社" where id=10;')
-
-
- with connection.cursor() as cur:
- # 删除id为1的一条记录
- cur.execute('delete from bookstore_book where id=1;')