一、本次任务
- 理解 django 迁移数据的命令
- 命令行可以 CRUD(增删改查) 数据
- 记录操作中的错误或问题
二、代码汇总
# django 操作数据
pipenv run python manage.py makemigrations # 生成一个migrations文件夹,该文件夹的内容就是数据库要执行的内容
pipenv run python manage.py migrate # 执行之前生成的migrations文件,真正的是操作数据库
# 备注:Django 每次更新模型都需要执行以上两步
pipenv run python manage.py sqlmigrate blog 0001 # 查看 app 的 0001 迁移文件的执行 sql
pipenv run python manage.py shell # 打开 python 交互模式
# Django 操作数据库命令
from blog.models impot Category, Tag, Post
# 创建/新增数据
c = Category(name='category test')
c.save()
# 获取数据
c = Category.objects.get(name='category test')
cc = Category.objects.all()
# 修改/更新数据
c.name = 'category test new'
c.save()
# 删除数据
c.delete()
三、操作截图
设置数据库
使用了 Python 内置的 SQLite3 数据库。
位置:blogproject/settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
数据迁移
pipenv run python manage.py makemigrations
"""
执行了 python manage.py makemigrations 后,django 在 blog 应用的 migrations\ 目录下生成了一个 0001_initial.py 文件,这个文件是 django 用来记录我们对模型做了哪些修改的文件。
只是告诉了 django 我们做了哪些改变,并没有真正地为我们创建数据库表。
"""
pipenv run python manage.py migrate
"""
让 django 真正地创建数据库表,执行了python manage.py migrate 命令。django 检测应用中 migrations\ 目录下的文件,得知我们对数据库做了哪些操作,然后把这些操作翻译成数据库操作语言,从而把这些操作作用于真正的数据库。
命令的输出除了 Applying blog.0001_initial... OK 外,django 还对其它文件做了操作。这是因为除了我们自己建立的 blog 应用外,django 自身还内置了很多应用,这些应用本身也是需要存储数据的。可以在 settings.py 的 INSTALLED_APP 设置里看到这些应用。
"""
pipenv run python manage.py sqlmigrate blog 0001
创建数据操作
pipenv run python manage.py shell
from blog.models import Category, Tag, Post
c = Category(name='category test')
c.save()
t = Tag(name='tag test')
t.save()
pipenv run python manage.py createsuperuser
再打开一个窗口,避免麻烦,数据都是从数据库读取的,所以这样做是可以的。
# 操作失误
# 模型中的字段跟创建时的字段不一致导致的
pipenv run python manage.py makemigrations
# 因为model改变了,所以需要这一步通知 django
pipenv run python manage.py migrate
# 需要将改变应用到数据库。
pipenv run python manage.py sqlmigrate blog 0002
# 错误记录
ManyToManyField 创建的时候不能这样创建,特此记录
获取数据操作
获取一条数据
# 获取一条数据,如果返回有多条或者没有数据,报错
Category.objects.get(name='category test')
# 截图中的错误是 ManyToManyField 不能这样创建数据。
获取全部数据
Category.objects.all()
Tag.objects.all()
Post.objects.all()
# 这张图片跟上面一张图片的区别是,在没有关闭命令行的前提下,代码中添加了 __str__
# 方法,但是重新获取全部数据不能看到返回的字符串。
# exit() 退出shell,重新进入,重新引入就可以了。
def __str__(self):
reurn self.name
pipenv run python manage.py shell
更新数据操作
删除数据操作
删除一条数据
删除多条数据
附上 Gitee 地址:https://gitee.com/langxing/HelloDjango-blog-tutorial