02. Django配置数据库

Django配置数据库


DATABASES = {
    'default': {
        # 数据库引擎(sqlite3,mysql,oracle等)
        'ENGINE': 'django.db.backends.mysql',
        # 数据库的名字
        'NAME': 'django_db1',
        # 连接数据库的用户名
        'USER': 'root',
        # 数据库的密码
        'PASSWORD': '123456',
        # 数据库的主机地址
        'HOST': '127.0.0.1',
        # 数据库的端口号
        'PORT': '3306'
    }
}

django中操作数据

# 使用Django封装好的connection对象,会自动读取setting.py中数据库的配置信息
from django.db import connection
    
    # 获取游标对象
    cursor = connection.cursor()
    # 拿到游标对象后只需sql语句
    cursor.execute("select id,name,author from book")
    # 获取所有数据
    rows = cursor.fetchall()
    # 遍历查询到的数据
    for row in rows:
        print(row)

python db api规范下cursor对象常用接口:

  1. rowcount:代表在执行了sql语句受影响的行数
  2. close: 关闭游标。关闭之后不能再使用否则会抛异常
  3. excute.execute(sql[,parameters]):执行某个sql语句。如果执行sql语句的时候还需要传递参数,那么可以传给parameters参数。
cursor.execute("select * from book where id=%s",(1,))
  1. fetchone: 在执行了查询操作以后,获取第一条数据
  2. fetchmany(size): 在执行查询操作以后,获取多条数据。具体多少条要看传的size参数,如果size不传默认一条
  3. fetchall:获取所有满足sql语句的数据

Python ORM模型

ORM模型映射到数据库中,需要如下几步:

  1. setting.py中配置好DATABASE,做好数据库相关的配置
  2. 在app中models.py中定义好模型,这个模型必须继承自Django.db.models
  3. 将这个app添加setting.pyINSTALLED_APP
  4. 在命令终端,在项目路径所在路径,然后执行命令Python manage.py makemigrations来生成迁移脚本文件。
  5. 同样在命令行中,执行命令python manage.py migrate来将迁移脚本文件映射到数据库中

本人英语比较菜鸡所有在pycharm里找到了可以快捷生成表的
在这里插入图片描述
在这里插入图片描述

ORM对数据库增删改查

  • 增’
1.使用orm添加一条数据到数据库中
    book = Book(name='西游记',author='吴承恩',price=100) # 字段=值 
    book.save()
book = Book.objects.get(pk=1)   # pk=primary_key:主键 删除主键字段等于1的数据
book.delete()
book = Book.objects.get(pk=1)
book.price = 200   # 要修改的字段 修改的值
book.save()        # 保存修改后的值
# 1.根据主键进行查找 primary key简写 pk
book = Book.objects.get(pk=1)
# 2.根据其他条件查找
book = Book.objects.filter('<字段名>'='<条件>').first() '第一个值'

ORM常用Field

AutoField:

映射到数据库中int类型,可以有自增长的特性。一般不需要使用这个类型,如果不指定主键,那么模型会自动的生成一个叫做id的自增长的主键。如果想指定其他名字的并且自动增长的主键,使用AutoField也可以

BigAutoField:

64位的整形,类似于AutoField,只不过是产生的数据范围是从1-992335353536364

BooleanField:

在模型层面接收的是True/False。在数据库层面是tinyint类型。如果没有指定默认值,默认值就是None。

charField:

对应数据库的varchar类型。必须指定最大的长度(max_length=最大长度)

DateField

日期类型。在python中是datetime.date类型,可以记录年月日。在映射到数据库中也是date类型。使用这个field可以传递以下几个参数:

  1. auto_now: 每次这个对象调用save方法的时候都会去将当前的时间更新
  2. auto_now_add: 是在第一次添加数据进去的时候会自动获取当前的时间
DateTimeField

日期时间类型,类似于datefield。不仅仅可以存储日期,还可以存储时间。映射到数据库中是datetime类型。这个field也可以使用auto_nowauto_now_add两个属性。

TimeField

时间类型。在数据库中是time类型。在python中是datetime.time类型。

EmailField

类似于charField。 在数据库底层也是一个varchar类型。最大长度是254个字符。

FileField

用来存储文件的

ImageField

用来存储图片文件的

FloatField

浮点类型。映射到数据库中是fload类型

整形

bigIntegerField

大整形

PositiveIntegerField

正整形。 值的区间是0-2147483647

小整形

小整形。 值的区间是-32768-32767

PostiveSmallIntegerField

正小整形。值的区间是0-32767

TextField

大量的文本类型。映射到数据库中的是loggetext类型

UUIDField

只能存储uuid格式的字符串。uuid是一个32位的全球唯一的字符串。一般用来作为主键。

URLField

类似于charField,只不过只能用来存储url格式的字符串。并且默认的max_length是200。

Field的常用参数

null
blank

表示这个字段在表单验证的时候是否可以为空。默认是false。这个和null是有区别的,null是一个纯数据库级别的

db_column

这个字段在数据库中的名字。如故没有设置这个参数,那么将会使用模型中属性的名字。

default

默认值。可以为一个值,或者是一个函数,但是不支持lambda表达式。并且不支持列表/字典/集合等可变的数据结构。

primary_key

是否为主键。默认是False

uuique

在表中这个字段的值是否唯一。一般设置手机号码/邮箱等。

模型中的Meta配置

class Book(models.model):
    name = models.CharField(max_length=20,null=false)
    
    class Meta:
        db_table='book_model'   # 数据库表名
ordering

设置在提取数据的排序方式。如果在查找字段前面加个-那么久倒叙排列。

外键和表关系

外键:

  1. 定义为class Foreignkey(to,on_delete,**options)
  • 第一个参数是引用的是哪个模型
  • 第二个参数是使用外键引用的模型数据被删除了,该字段如何处理
class Category(models.Model):
    name = models.CharField(u'分类', max_length=100)

    class Meta:
        db_table ='Category'


class User(models.Model):
    tiele = models.CharField(u'名称', max_length=100)
    content = models.TextField(u'内容')
    Category = models.ForeignKey("Category", on_delete=models.CASCADE)

    class Meta:
        db_table = 'User'
        
# 如果需要引用另外app下模型作为外键
# app.模型的名字
# 如果模型的外键引用的是本身自己这个模型,那么to参数可以为`self`,或者是这个模型的名称。

外键删除操作:

  1. CASCADE:级联操作。如果外键对应的那条数据被删除了,那么这条数据也会被删除。
  2. PROTECT:受保护。即只要纸条数据引用了外键的那条数据,那么就不能删除外键的那条数据。
  3. SET_NULL:设置默认值。如果外键的那条数据被删除了,那么在本条数据上就将这个字段设置为空。如果设置这个选项,前提是要指定这个字段可以为空。
  4. SET_DEFAULT:设置默认值。如果外键的那条数据被删除了,那么本数据上就将这个字段设置为默认值。如果设置这个选项,前提示是要指定这个字段一个默认值。
  5. SET(): 如果外键的那条数据被删除了。那么将会获取SET函数中的值来作为这个外键的值。SET函数可以接收一个可以调用的对象(比如函数或者方法),如果是可以调用的对象,那么会将这个对象调用后的结果作为值返回回去。
  6. DO_NOTHING:不采取任何行为。一切全看数据库级别的约束。

表关系

一对多

一对一:

  1. 在Django中一对一是通过models.OneToOneFiel来实现的。这个OneToOneFiel其实本质上就是一个外键,只不过这个外键有一个唯一约束(unique key),来实现一对一。
  2. 以后如何想要反向应用,那么是通过引用的模型的名字转换为小写的形式进行访问。例如下面模型:
class Student(models.Model):
    Studentname = models.CharField(max_length=100)

class StudnetExtension(models.Model):
    School = models.CharField(max_length=100)
    Student = models.OneToOneField("Student", on_delete=models.CASCADE, related_name="extension")

StudnetExtension的对象,可以通过Student来访问对应Studnet对象。并且Student对象可以使用StudnetExtension来访问对应的的StudnetExtension对象。

如果不想使用Django默认的引用属性,那么可以在models.OneToOneField中添加一个related_name参数。那么以后就可以通过related_name设置的名称进行访问。

多对多:

  1. 实现多对多的方式django 专门提供了一个Field。叫做ManyToManyField。示例代码如下:
# 多对多
class shuming(models.Model):
    title = models.CharField("书名", max_length=100)
    content = models.TextField("内容")

    class Meta:
        db_table = "shuming"


class Tag(models.Model):
    name = models.CharField("标签名称", max_length=100)
    shuming = models.ManyToManyField("shuming")

    class Meta:
        db_table = "tag"

在数据库层面,实际上django是为这种多对多的关系建立了一个中间表。这个中间表分别定义了两个外键,引用了模型中两张表的主键。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值