Python学习第114天(Django中的数据库配置)

数据库的配置

1    django默认支持sqlite,mysql, oracle,postgresql数据库。

     <1> sqlite

            django默认使用sqlite的数据库,默认自带sqlite的数据库驱动 , 引擎名称:django.db.backends.sqlite3

     <2> mysql

            引擎名称:django.db.backends.mysql

2    mysql驱动程序

  •    MySQLdb(mysql python)
  •    mysqlclient
  •    MySQL
  •    PyMySQL(纯python的mysql驱动程序)

3     在django的项目中会默认使用sqlite数据库,在settings里有如下设置:

  

如果我们想要更改数据库,需要修改如下:

  

DATABASES = {

    'default': {

        'ENGINE': 'django.db.backends.mysql', 

        'NAME': 'books',    #你的数据库名称

        'USER': 'root',   #你的数据库用户名

        'PASSWORD': '', #你的数据库密码

        'HOST': '', #你的数据库主机,留空默认为localhost

        'PORT': '3306', #你的数据库端口

    }

}

注意:

NAME即数据库的名字,在mysql连接前该数据库必须已经创建,而上面的sqlite数据库下的db.sqlite3则是项目自动创建

USER和PASSWORD分别是数据库的用户名和密码。

设置完后,再启动我们的Django项目前,我们需要激活我们的mysql。

然后,启动项目,会报错:no module named MySQLdb

这是因为django默认你导入的驱动是MySQLdb,可是MySQLdb对于py3有很大问题,所以我们需要的驱动是PyMySQL

所以,我们只需要找到项目名文件下的__init__,在里面写入:

import pymysql
pymysql.install_as_MySQLdb()

问题解决!

上面这些是mysql的配置,那么关于数据库我们是如何进行创建的呢?

  先说一下SQLit的形式吧

首先是在app下的modles文件先以类的形式进行创建

from django.db import models

# Create your models here.

class Book(models.Model):
    name = models.CharField(max_length=10)
    price = models.IntegerField()
    pub_date = models.DateField()

这里需要特别注意的是,这个类必然继承了models.Model

  同时此时这个类的每个实例对象就相当于数据库下的table中的一行数据

  输入完成后需要执行python manage.py makemigrations

  随后,migration中会多一个文件

 

 其中的内容如下:

class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='Book',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name', models.CharField(max_length=10)),
                ('price', models.IntegerField()),
                ('pub_date', models.DateField()),
            ],
        ),
    ]

会自动生成主键(非空且唯一)

此时在进行执行

python manage.py migrate

随后就会产生一堆表格,其中就有你通过类创建的表格

 

 大致就是这些部分的内容了,然后具体怎么用就到明天,今天的内容还是很多的啊。

接着是ORM(对象关系映射)

用于实现面向对象编程语言里不同类型系统的数据之间的转换,换言之,就是用面向对象的方式去操作数据库的创建表以及增删改查等操作。

优点: 1 ORM使得我们的通用数据库交互变得简单易行,而且完全不用考虑该死的SQL语句。快速开发,由此而来。

          2 可以避免一些新手程序猿写sql语句带来的性能问题。

            比如 我们查询User表中的所有字段:

 

新手可能会用select * from  auth_user,这样会因为多了一个匹配动作而影响效率的。

 缺点:1  性能有所牺牲,不过现在的各种ORM框架都在尝试各种方法,比如缓存,延迟加载登来减轻这个问题。效果很显著。

          2  对于个别复杂查询,ORM仍然力不从心,为了解决这个问题,ORM一般也支持写raw sql。

          3  通过QuerySet的query属性查询对应操作的sql语句    

author_obj=models.Author.objects.filter(id=2)
print(author_obj.query)

   以上今天的所有内容。。。

posted @ 2020-06-20 21:33  崆峒山肖大侠  阅读(157)  评论(0编辑  收藏  举报