Django blog - 04 - Django 数据库迁移
2017-09-22 09:43
495 查看
迁移数据库
实际上这些数据库表还没有真正的在数据库中创建,接下来Django将
Python 代码翻译成数据库语言
manage.py
文件所在的目录下,运行
Django 在 blog应用的migrations\目录下生成了一个0001_initial.py文件
即 Django用来记录我们对模型做了哪些修改的文件
在 models.py文件里创建有 3个模型类,Django把这些变化记录在了
0001_initial.py
接下来执行python manage.pymigrate命令。
Django 通过检测应用中 migrations\目录下的文件,得知对数据库做了哪些操作,然后把这些操作翻译成数据库操作语言,从而把这些操作作用于真正的数据库。
看到命令的输出除了 Applying blog.0001_initial... OK外,Django还对其它文件做了操作。因为除了我们自己建立的
blog应用外,Django自身还内置了很多应用,这些应用本身也是需要存储数据的。可以在
settings.py的 INSTALLED_APP设置里看到这些应用。
运行python manage.pysqlmigrate blog 0001命令:
输出了经 Django翻译后的数据库表创建语句,这有助于你理解 Django ORM的工作机制。
数据库版本
Python内置的
SQLite3数据库,没有安装任何的数据库软件,Django就帮我们迁移了数据库。
SQLite3是一个十分轻巧的数据库,它仅有一个文件。项目根目录下会多出了一个
db.sqlite3的文件,这就是 SQLite3数据库文件,Django博客的数据都会保存在这个数据库文件里。
Django在
settings.py里为我们做了一些默认的数据库配置:看到默认的数据库引擎就是使用的 SQLite3。
Django 也可以配置 MySQL等大型数据库。可以自行使用搜索引擎或者查阅
Django的官方文档。
用 Django的方式操作数据库
存数据
manage.py所在目录下运行python
manage.pyshell命令:打开了一个交互式命令行
首先我们来创建一个分类和一个标签:
导入 3个之前写好的模型类,然后实例化了一个 Category类和一个
Tag类,为其属性 name赋了值。为了让 Django把这些数据保存进数据库,调用实例的
save方法即可。
创建一篇文章
创建文章之前,需要先创建一个 User,用于指定文章的作者。
创建 User的命令Django已经写好了,依然是通过
manage.py来运行。
首先按住 Ctrl + z退出命令交互栏
运行python manage.pycreatesuperuser命令并根据提示创建用户:
再次运行
Python 命令交互栏,开始创建文章:
重启 shell,此时需要重新导入了 Category、Tag、Post以及
User
并导入了一个 Django提供的辅助模块 timezone,调用其
now()方法为 created_time和 modified_time指定时间,容易理解
now方法返回当前时间
然后根据用户名和分类名,通过 get方法取出了存在数据库中的 User和
Category
接着为文章指定了 title、body、created_time、modified_time值,并把它和前面创建的
Category 以及 User关联了起来
允许为空 excerpt、tags就没有为它们指定值了
注意:我们这里使用
category test 的分类记录。确保数据库中只有一条值为 category test的记录,否则
取数据
这里使用了
看到
为 3个模型分别增加一个
Blog/models.py文件:
classCategory(models.Model):
...
def
__str__(self):
returnself.name
classTag(models.Model):
...
def
__str__(self):
returnself.name
classPost(models.Model):
...
def
__str__(self):
returnself.title
定义好
而
Ctrl + z退出
Shell,再重新运行
创建文章时通过 get方法来获取数据, all方法和
get方法的区别是:
all 方法返回全部数据,是一个类似于列表的数据结构(QuerySet)
get 返回一条记录数据,如有多条记录或者没有记录,get方法均会抛出相应异常
改数据
首先通过
category test 到分类,修改它的
category test new,然后调用
删数据
fromblog.modelsimport
Category, Tag, Post
先根据标题
QuerySet(类似于一个列表),表明数据库中已经没有 Post,Post已经被删除了。
Django官方文档
Django blog - 04 - 博客首页
实际上这些数据库表还没有真正的在数据库中创建,接下来Django将
Python 代码翻译成数据库语言
manage.py
文件所在的目录下,运行
python manage.py makemigrations
Django 在 blog应用的migrations\目录下生成了一个0001_initial.py文件
即 Django用来记录我们对模型做了哪些修改的文件
在 models.py文件里创建有 3个模型类,Django把这些变化记录在了
0001_initial.py
接下来执行python manage.pymigrate命令。
Django 通过检测应用中 migrations\目录下的文件,得知对数据库做了哪些操作,然后把这些操作翻译成数据库操作语言,从而把这些操作作用于真正的数据库。
看到命令的输出除了 Applying blog.0001_initial... OK外,Django还对其它文件做了操作。因为除了我们自己建立的
blog应用外,Django自身还内置了很多应用,这些应用本身也是需要存储数据的。可以在
settings.py的 INSTALLED_APP设置里看到这些应用。
运行python manage.pysqlmigrate blog 0001命令:
输出了经 Django翻译后的数据库表创建语句,这有助于你理解 Django ORM的工作机制。
数据库版本
Python内置的
SQLite3数据库,没有安装任何的数据库软件,Django就帮我们迁移了数据库。
SQLite3是一个十分轻巧的数据库,它仅有一个文件。项目根目录下会多出了一个
db.sqlite3的文件,这就是 SQLite3数据库文件,Django博客的数据都会保存在这个数据库文件里。
Django在
settings.py里为我们做了一些默认的数据库配置:看到默认的数据库引擎就是使用的 SQLite3。
Django 也可以配置 MySQL等大型数据库。可以自行使用搜索引擎或者查阅
Django的官方文档。
用 Django的方式操作数据库
存数据
manage.py所在目录下运行python
manage.pyshell命令:打开了一个交互式命令行
首先我们来创建一个分类和一个标签:
导入 3个之前写好的模型类,然后实例化了一个 Category类和一个
Tag类,为其属性 name赋了值。为了让 Django把这些数据保存进数据库,调用实例的
save方法即可。
创建一篇文章
创建文章之前,需要先创建一个 User,用于指定文章的作者。
创建 User的命令Django已经写好了,依然是通过
manage.py来运行。
首先按住 Ctrl + z退出命令交互栏
运行python manage.pycreatesuperuser命令并根据提示创建用户:
再次运行
python manage.pyshell进入
Python 命令交互栏,开始创建文章:
重启 shell,此时需要重新导入了 Category、Tag、Post以及
User
并导入了一个 Django提供的辅助模块 timezone,调用其
now()方法为 created_time和 modified_time指定时间,容易理解
now方法返回当前时间
然后根据用户名和分类名,通过 get方法取出了存在数据库中的 User和
Category
接着为文章指定了 title、body、created_time、modified_time值,并把它和前面创建的
Category 以及 User关联了起来
允许为空 excerpt、tags就没有为它们指定值了
注意:我们这里使用
get方法根据
Category的
name属性的值获取分类的一条记录。
Category.objects.get(name='categorytest')的含义是从数据库中取出
name的值为
category test 的分类记录。确保数据库中只有一条值为 category test的记录,否则
get方法将返回一个
MultipleObjectsReturned异常。如果你不小心已经存了多条记录,请删掉多余的记录。如何删除数据请看下文。也可以删除db.sqlite3文件重新开始本部分。
取数据
objects是我们的模型管理器,提供一系列从数据库中取数据方法
这里使用了
all方法,表示要把对应的数据全部取出来。
看到
all方法都返回了数据,这些数据应该是之前存进去的,但显示的字符串无法确认
为 3个模型分别增加一个
__str__方法,显示出来的数据更加人性化一点:
Blog/models.py文件:
classCategory(models.Model):
...
def
__str__(self):
returnself.name
classTag(models.Model):
...
def
__str__(self):
returnself.name
classPost(models.Model):
...
def
__str__(self):
returnself.title
定义好
__str__方法后,解释器显示的内容将会是
__str__方法返回的内容。
Category返回分类名
name,
Tag返回标签名
而
Post返回它的
title
兼容 Python2:使用[code]python_2_unicode_compatible装饰器(fromdjango.utils.siximport python_2_unicode_compatible)或者则将
__str__方法改为
__unicode__方法即可[/code]
Ctrl + z退出
Shell,再重新运行
python manage.py shell进入 Shell,执行之前命令:
创建文章时通过 get方法来获取数据, all方法和
get方法的区别是:
all 方法返回全部数据,是一个类似于列表的数据结构(QuerySet)
get 返回一条记录数据,如有多条记录或者没有记录,get方法均会抛出相应异常
改数据
首先通过
get方法根据分类名
name获取值为
category test 到分类,修改它的
name属性为新的值
category test new,然后调用
save方法把修改保存到数据库,之后可以看到数据库返回的数据已经是修改后的值了。
Tag、
Post的修改也一样。
删数据
fromblog.modelsimport
Category, Tag, Post
先根据标题
title的值从数据库中取出
Post,保存在变量
p中,然后调用它的
delete方法,最后看到
Post.objects.all()返回了一个空的
QuerySet(类似于一个列表),表明数据库中已经没有 Post,Post已经被删除了。
Django官方文档
Django blog - 04 - 博客首页
相关文章推荐
- windows创建django项目以及创建数据库的时候提示:No module named blog
- 让 Django 完成翻译:迁移数据库
- No module named 'MySQLdb'(第一次django下创建数据库迁移,报错)
- 关于django 数据库迁移(migrate)应该知道的一些事
- Django-South 实现数据库自动迁移
- 详解关于Django中ORM数据库迁移的配置
- 使用python和Django完成博客数据库的迁移方法
- Blog.objects.filter()反查外键,django数据库models中的跨表查询,相当于sql的join
- Django +nginx+gunicorn+阿里云部署笔记之git 与数据库迁移 +本地与服务器文件传输
- django构建blog--建立数据库部分+admin部分(eclipse+pydev)
- 复习django项目一——迁移数据库
- django中向mysql中迁移数据库的命令
- django数据库表结构自动迁移
- django项目数据库迁移过程记录及注意事项
- django-10-数据库使用04 后台安装配置及增加用户对数据库基本读写操作
- Django: 之数据库导入、迁移和联用
- django数据库迁移sqlmigrate调试
- django数据库迁移的小思考
- django 2.0 添加外键后,迁移数据库的提示缺少参数on_delete问题
- django数据库迁移相关【sqlite3迁移到MySQL】(django2.0.3测试通过)