- 检查mysql并创建库
-
mysql是否正常运行,一般使用工具或命令行连接一次
输入命令后,以下画面则表示mysql正常:
命令: test@test:~$ mysql -u root -p1q2w3e4r
- 创建库
mysql> create database test_db;
或者用工具创建 ,数据工具创建的话,默认编码需要填写utf8
-
数据库连接配置,修改settings.py中配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 你的数据库引擎
'HOST': "localhost", # 你的数据地址,localhost代表本地
# 端口,数据库的默认端口一般是3306,如果就算采用虚拟机NAT方式,此端口是指虚拟机上mysql端口,
# 因为连接数据库前用ssh连接了,后面操作就相当于在虚拟机环境本地连接
"PORT": 3306,
"USER": "root", # 用户名
"PASSWORD": "qwe123", # 密码
"NAME": "test_db" # 库名
}
}
-
运行项目
数据库连接报错,缺少组件,可以安装以下的包
安装依赖(如果使用虚拟环境,需要在虚拟环境下安装)
安装mysql开发依赖包
sudo apt-get install libmysqlclient-dev gcc
配置mysql_config(如果使用虚拟环境,需要在虚拟环境下安装)
sudo updatedb
locate mysql_config
pip install MySQL-python(这个要切换到对应python环境中去执行)
ps: 按着执行就可以
注意:
PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb。
Django 在连接 MySQL 数据库时默认使用的是 MySQLdb 驱动, 然而我们没有安装该
驱动, 因为它并不支持 Python3, 我们现在安装的是 PyMySQL 驱动
pip install PyMySQL(py3虚拟环境中)
如何让当前的 Django 通过 PyMySQL 来
连接 MySQL 数据库呢? 方法很简单。
在.../项目/__init__.py 目录下添加:
import pymysql
pymysql.install_as_MySQLdb()
如果出现连接被拒绝的错误:
1.查看你的配置是否填写错误;
2.检查你的用户是否有远程权限;
基于安全考虑root账户一般只能本地访问,但是在开发过程中可能需要打开root的远程访问权限。下面是基本的步骤:
1、登录到mysql中,为root进行远程访问的授权,执行下面的命令:
mysql> GRANT ALL PRIVILEGES ON . TO root@"%" IDENTIFIED BY "passwd";
mysql> flush privileges;
第一句中"%"表示任何主机都可以远程登录到该服务器上访问。如果要限制只有某台机器可以访问,将其换成相应的IP即可,如:
GRANT ALL PRIVILEGES ON . TO root@"192.168.2.135" IDENTIFIED BY "passwd";
第二句表示从mysql数据库的grant表中重新加载权限数据。因为MySQL把权限都放在了cache中,所以在做完更改后需要重新加载。
默认mysql的用户是没有远程访问的权限的,因此当程序跟数据库不在同一台服务器上时,我们需要开启mysql的远程访问权限。
- 编写对应的model
- 在每个app中都有对应的models.py文件,我们可以在里面定义你需要的models
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models
# Create your models here.
class Article(models.Model): #类名代表了数据库表名,且继承了models.Model,类里面的字段代表数据表中的字段(name)
#属性=models.字段类型(选项)
# 如果没有添加主键,django会默认添加一个ID的主键
title = models.CharField(u'标题',max_length = 20, null = False) #第一参数为备注
content = models.CharField(u'内容',max_length=150, null = False)
comment = models.CharField(u'评论',max_length = 50)
reply = models.CharField(u'回复',max_length=50)
status = models.IntegerField(u'状态',default = 1)
- 生成对应的migrations文件
python manage.py makemigration
生成对应文件:
可能pycharm没有这个py文件,需要从远程服务器download下来。
使用makemigrations 命令需要事项
1、一但将生成的migrations文件通过migrate命令同步至数据库以后,被操作的migrations文件不能再操作
2、如何避免上面的情况:
(1)不要对已经生成好的migrations文件做任何操作
(2)所有对数据库的操作同一个人做,并保留好一套migrations文件
(3)不要直接在数据库中修改任何操作,比如修改字段,添加字段,删除
ps: 一套对应生成的migrations文件与数据库需保存一致,否则系统会报错!!!
ps: 需要对数据库表的操作都需要models.py,然后走对应的migrate流程,不能直接在数据库中修改数据字段等等;
如果我之前通过model创建过表之类的,也有数据,后期因业务需要对现存表进行字段扩充或者条件约束,如果对原有model修改,那么原有的migrations文件不能变动,只需要重新 python manage.py makemigration,它会与之前文件比较生成另外的文件的,然后migrate命令同步到数据库,不影响历史数据的。
- 迁移同步,同步到数据库
python manage.py migrate
- 新增数据
前面已经建立了表结构,现在需要为其添加数据
#views.py
from .models import Article
class AddArticle(View):
def get(self,request):
# article = Article()
# article.title = '2使用django新增一条数据'
# article.content = '2可以使用django的save方法持久化一条数据'
# article.comment = '2文章总结的到位,点赞'
# article.reply = '2谢谢,互相学习'
# 以下为新增数据简写的方式
article = Article(title="3使用django新增一条数据",content = '3可以使用django的save方法持久化一条数据',
comment = '3文章总结的到位,点赞',reply = '3谢谢,互相学习')
article.save() #使用save方法保存
article = Article..objects.create(title="3使用django新增一条数据",content = '3可以使用django的save方法持久化一条数据') #create方式新增数据
return render(request,'addArticle.html',locals())
#如果要在前台展示插入的值,可以写个模板页面addArticle.html
#注意如果存在外键之类的,要么对象.数据库表中对应的字段,要么对象.属性.外键
<p>标题:{{article.title}}</p>
<p>内容:{{article.content}}</p>
<p>评论:{{article.comment}}</p>
<p>回复:{{article.reply}}</p>
</body>
#urls.py
url(r'^addarticle/$', views.AddArticle.as_view())
插入数据库中的值页面效果:
注意:
用一句话方便的创建并保存一个对象。
objects.create 直接创建并保存了对象,这样 user 代表的就是一个已经保存在数据库中的实例,如果需要一步完成对象的创建与存储至数据库,则使用objects.create()方法;
而方法二的 user 则是一个没有保存在数据库中的实例,如果涉及到 user 是某个对象的外键则需要把它真正存进数据库后才能设置为相应的外键,如果用方法一的方式创建则不用担心这个问题,直接设置就可以了。
二者最后达到的目的是一样的,区别就在于如果在创建对象时所需的数据都知道那么可以直接用 create,反之则需要 save。 当然一直用 save 也没有任何问题。
- 查询
#views.py
class DisplayArticle(View):
def get(self,request):
# 查询单个数据
# 通过get方式返回的数据,它只会返回一个对象
#如果通过条件返回的数据有多条或者找不到,都会报错
# article = Article.objects.get(pk=1) #在django 的ORM查询中,数据库的主键可以用PK代替, 官方推荐使用pk
# article = Article.objects.get(id=1)#等同于select * from hello_article where id=1;
#使用all()方法获取所有
articleAll = Article.objects.all()
return render(request,'displayArticle.html',locals())
#displayArticle.html模板页面
<body>
{#单个查询结果: <br/>#}
{#<p>标题:{{article.title}}</p>#}
{#<p>内容:{{article.content}}</p>#}
{#<p>评论:{{article.comment}}</p>#}
{#<p>回复:{{article.reply}}</p>#}
Article.object.all()的查询结果: <br/>
{% for article in articleAll %}
<p>标题:{{article.title}}</p>
<p>内容:{{article.content}}</p>
<p>评论:{{article.comment}}</p>
<p>回复:{{article.reply}}</p>
{% endfor %}
</body>
#urls.py
url(r'^displayArticle/$', views.DisplayArticle.as_view())
- 删除
class DelArticle(View):
def get(self,request):
# 批量删除
# 等同于 DELETE FROM hello_article WHERE status=0
# 批量删除,如果找不到数据,就不会删除
# Article.objects.filter(status = 0).delete()
# 删除单个
# DELETE FROM hello_article WHERE id=9
# 如果数据不存在,则会报错
Article.objects.get(id=9).delete()
#删除之后在查询
articleAll = Article.objects.all()
return render(request,'displayArticle.html',locals())
- 修改
class UpdateArticle(View):
def get(self,request):
# 批量修改
# UPDATE hello_article SET status=3 WHERE status=2
# Article.objects.filter(status=2).update(status=3)
# 单个修改
# 实际上save方法如果当前实例已经存在于数据库中,它就会当作一个update操作
# Article.objects.filter(id=7).update(status=4)
article = Article.objects.get(pk=8) #取出pk=7的对象,然后修改其状态,再保存
article.status = 0
article.save()
#更新之后在查询
articleAll = Article.objects.all()
return render(request, 'displayArticle.html', locals())