数据库的配置
django支持的数据库类型有sqlite、MySQL、oracle、postgresql。
Django默认使用的是sqlite数据库,自带了sqlite数据库驱动,引擎名为django.db.backends.sqlite3。在settings.py中可以查看
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
使用MySQL时需要修改这个配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'books', #数据库名称
'USER': 'root', #数据库用户名
'PASSWORD': '', #数据库密码
'HOST': '', #数据库主机,留空默认为localhost
'PORT': '3306', #数据库端口
}
}
启动项目,会报错:no module named MySQLdb
这是因为django默认导入的驱动是MySQLdb,可是MySQLdb对于py3有很大问题,所以我们需要的驱动是PyMySQL,只需要找到项目名文件下的__init__,在里面写入:
import pymysql
pymysql.install_as_MySQLdb()
ORM
前面讲过ORM是对数据库操作的封装,对ORM操作即可实现对数据库的增删改查等操作。
先在modules.py中创建几个表
from django.db import models
class UserInfo(models.Model):
#num = models.IntegerField(default=0) #创建数字类型的字段名,默认是0
name = models.CharField(max_length=32, verbose_name="姓名") #创建一个字符类型的字段,最大长度为32
username = models.CharField(max_length=32,null=True)
password = models.CharField(max_length=32,null=True)
def __str__(self):
return self.username
#return self.num+self.name+self.username
class Number(models.Model):
num = models.OneToOneField(to="UserInfo", verbose_name="学号") #该表与UserInfo表一对一关系
def __str__(self):
return self.num
class School(models.Model):
name = models.CharField(max_length=128, null=True, blank=True, verbose_name="名字")
mac = models.URLField(max_length=128, null=True, blank=True, verbose_name="地址") #URLField也是字符类型,只是python封装了判断URL的算法
email = models.EmailField(max_length=128, null=True, blank=True, verbose_name="邮箱") #EmailField也是字符类型,只是python封装了判断email的算法
#true_false = models.BooleanField(max_length=128, null=True, blank=True, verbose_name="是否") #布尔类型的
#date = models.DateField(verbose_name="日期") #日期类型
#cla = models.ForeignKey(to="Classes") #该表对classes表的关系是一对多
def __str__(self):
return self.name
class Classes(models.Model):
sch = models.ForeignKey(to="School", default=1)
name = models.CharField(max_length=128, null=True, blank=True, verbose_name="班级名")
user = models.ManyToManyField(to="UserInfo") #该表与UserInfo表是多对多关系
def __str__(self):
return self.name
在多对多关系中,Django会额外创建一个classes和userinfo对应关系的表classes_user表
查询
以上已经创建了几个表,再往每个表中添加一些数据,下面开始从数据库中查询数据
在urls.py文件中配置路由到views的test方法
url(r'^test/', views.test),
views.py文件
def test(request):
school_li = models.School.objects.all() #获取到School表中所有数据,放到school_li变量中
for item in school_li:
print(item.name, item.email)
school = models.School.objects.get(id=1) #使用get时,如果检索值不存在,则会报错
print(school.name)
obj = models.School.objects.filter(name='new_east') #使用filter时,如果检索的值不存在,则返回空(没有值),推荐使用filter方法
for item in obj:
print(item)
dic = {'name':'new_east'}
obj1 = models.School.objects.filter(**dic).first()
print(obj1)
obj2 = models.School.objects.get(**dic)
print(obj2)
return HttpResponse("查询数据")
代码中列举了几种查询的方法,根据需要来选择。
增加
在views.py的test方法中对数据库表增加数据。
def test(request):
dic1= {'name': '蓝翔'}
obj3 = models.School.objects.create(**dic1)
print(obj3)
obj4 = models.School.objects.create(name='黄埔', mac='http://www.huangpu.com', email='[email protected]')
print(obj4)
return HttpResponse("插入数据")
启动后,访问test页面就会在school表中插入数据。
删除
从数据库表中删除数据,其实也比较简单,还是写在view里的test方法中
obj5 = models.School.objects.filter(id=3).delete()
#obj5 = models.School.objects.filter(**dic).delete()
print(obj5)
执行后,obj5是一个元组,会有两个元素,第一个是删除的条数,第二个元素是一个字典,字典里的是删除表名和对应的条数
(1, {'demo.School': 1})
obj5的输出结果
修改
修改也比较简单,看代码
obj6 = models.School.objects.filter(name='黄埔').update(name='北大', mac='https://www.pku.edu.cn', email='[email protected]')
print(obj6)
执行后返回的是一个int类型,表示修改的行数
修改还有另一种方法
obj7 = models.School.objects.get(name='黄埔')
obj7.name='北大'
obj7.save()
这种方法不推荐使用,因为在get时如果查找的值不存在会报错,而且没有第一种方法简洁