Django为多种数据库后台提供了统一的调用API。根据需求不同,Django可以选择不同的数据库后台。MySQL算是最常用的数据库。我们这里将Django和MySQL连接;
一、mysql驱动
使用的sql连接包不同,Python2.x 版本要安装mysql-python,而Python3.x版本要安装 mysqlclient ;
py文件输入:import MySQLdb
若未报错则安装成功!
或者使用pymysql,如下操作:
在APP中的__init__.py文件中添加代码:
import pymysql pymysql.install_as_MySQLdb()
如果在下面第四步时报错:mysqlclient 1.3.13 or newer is required; you have 0.9.3.
则可修改部分文件代码可解决,参考来源:https://blog.csdn.net/weixin_33127753/article/details/89100552
二、mysql用户创建和赋权
1、启动mysql: mysql -u root -p
2、建库: CREATE DATABASE villa DEFAULT CHARSET=utf8;
3、创建账户: create user '用户名'@'访问主机' identified by '密码';
create user 'yinwenbin'@'localhost' identified by 'password';
4、赋予权限: grant 权限列表 on 数据库.* to '用户名'@'访问主机' ;(修改权限时在后面加with grant option)
grant SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES
on villa.* TO 'yinwenbin'@'localhost';
grant all privileges on villa.* TO '用户名'@'localhost';
//刷新系统权限表,否则会出现拒绝访问
flush privileges;
三、settings设置
1、在settings.py中,将DATABASES对象更改为:
DATABASES = { # 'default': { # 'ENGINE': 'django.db.backends.sqlite3', # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), # } 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'villa', 'USER': 'yinwenbin', 'PASSWORD': 'password', 'HOST':'localhost', 'PORT':'3306', } }
MySQL是关系型数据库。但在Django的帮助下,我们不用直接编写SQL语句。
Django将关系型的表(table)转换成为一个类(class)。而每个记录(record)是该类下的一个对象(object)。
四、models.py设置
class Character(models.Model): name = models.CharField(max_length=200) def __unicode__(self): return self.name
类Character定义了数据模型,它需要继承自models.Model。
在MySQL中,类是一个表。表只有一列name,是类的属性。 可以看到,name是字符类型,最大长度为200。
类Character有一个__unicode__()方法,用来说明对象的字符表达方式。如果是Python 3,定义__str__()方法,实现相同的功能。
五、同步DB
Django根据models.py中描述的数据模型,在MySQL中真正的创建各个关系表:
以下命令适用django1.9版本及以上
先执行 python manage.py makemigrations
再执行 python manage.py migrate
同步数据库后,Django将建立相关的MySQL表格
六、查询DB数据并使用
1、在Character表中name列插入Sidney 、Django 、John三条数据
2、在views.py编辑相应的方法如下
def operationDB(request): #objects是是django默认的管理器对象,自己也可以在Character类下设置:objects=models.Manage() data=Character.objects.all() staff_str = list(map(lambda a:a.name, data)) return HttpResponse("<p>" + ' '.join(staff_str) + "</p>")
3、在mysite下的urls.py加上上面步骤的路径,然后访问即可查看效果
练习1:
1、home.html文件修改
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>我的第一个网页</title> </head> <body> <a href="/add/4/5/">计算 4+5</a> <h1>{{ label }}</h1> </body> </html>
2、views
def index2(request): data = Character.objects.all() staff_str = list(map(lambda a: a.name, data)) context = {} context['label'] = ' '.join(staff_str) return render(request,'home.html',context)
练习2
1、for.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>我的第二个网页</title> </head> <body> {% for item in staffs %} <p>{{ item.id }}, {{item}}</p> {% endfor %} </body> </html>
2、views
def operationDB(request): #objects是是django默认的管理器对象,自己也可以在Character类下设置:objects=models.Manage() data=Character.objects.all() #staff_str = list(map(lambda a:a.name, data)) #return HttpResponse("<p>" + ' '.join(staff_str) + "</p>") return render(request,'for.html',{"staffs":data})