Django(part20)--数据库和模型(Django 数据库)

网友投稿 230 2022-08-31


Django(part20)--数据库和模型(Django 数据库)

学习笔记,仅供参考,有错必纠

文章目录

​​数据库和模型​​

​​Django下使用mysql数据库​​

​​安装pymysql包​​​​创建和配置数据库​​

​​模型(Model)​​

​​模型概述​​​​python数据库模型-Models​​​​案例​​

数据库和模型

Django中默认数据库是SQLite数据库,就是db.sqlite3文件。注意!数据库一定是用文件来存储的,只不过数据库对这些文件进行了统一管理,并加入了一些事务和表的概念,会使我们操作起来更加方便。

Django下使用mysql数据库

安装pymysql包

在cmd中敲入下面的代码,安装pymysql:

pip install pymysql

我已经装过了,在这里就不演示了。

安装mysql客户端:

pip install mysqlclient

在这里,我重新安装了一下mysqlclient。

创建和配置数据库

为了学好这个知识点,我们先创建一个新的工程mywebsite_db:

F:\MyStudio\PythonStudio\goatbishop.project01\Django>django-admin startproject mywebsite_db

创建数据库

语法:

create database 数据库名 default charset utf8 collate utf8_general_ci;

上面这段代码表示,创建一个utf8编码的数据库,且数据库中的英文不区分大小写。

现在,我们创建自己的数据库mywebdb:

create database mywebdb default charset utf8 collate utf8_general_ci;

数据库的配置

在settings.py文件中有一个DATABASES字典,如下所示:

DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), }}

我们看到默认的数据库引擎是sqlite3,默认的文件是db.sqlite3

如果,我们需要使用mysql数据库,就需要对其进行配置:

DATABASES = {# 'default': {# 'ENGINE': 'django.db.backends.sqlite3',# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),# } 'default' : { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mywebdb', # 数据库名称,需要自己定义 'USER': 'root', 'PASSWORD': '19970928', # 管理员密码 'HOST': '127.0.0.1', 'PORT': 3306, #mysql端口号 }}

这时,我们还需要添加对mysql的支持,也就是在mywebsite_db文件夹下的​​__init__.py​​模块中加入如下内容:

import pymysqlpymysql.install_as_MySQLdb()

数据库的迁移

迁移是Django同步对模型所做的更改(添加字段,删除模型等)到数据库的一种方式。

迁移第1步:生成或更新迁移文件

python manage.py makemigrations

迁移第2步:执行迁移脚本程序(更新数据库)

python manage.py migrate

最后,我们可以查看一下迁移执行的SQL语言(不必要):

python manage.py sqlmigrate

现在,我们进行数据库迁移:

F:\MyStudio\PythonStudio\goatbishop.project01\Django\mywebsite_db>python manage.py makemigrations

这时,我们报了一个错误:

raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.

我在网上查了一下,准备采用改源代码的方式解决我们的问题。解决方法

首先,注释掉F:\software\Anaconda\Lib\site-packages\django\db\backends\mysql目录下base.py文件中的下面这一部分(​​35 - 36行​​):

version = Database.version_info#if version < (1, 3, 13):# raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)

再找到和base.py一个文件夹下的operations.py文件,并将decode改为encode:

def last_executed_query(self, cursor, sql, params): # With MySQLdb, cursor objects have an (undocumented) "_executed" # attribute where the exact query sent to the database is saved. # See MySQLdb/cursors.py in the source distribution. query = getattr(cursor, '_executed', None) if query is not None: query = query.decode(errors='replace') return query#--------改为-------- def last_executed_query(self, cursor, sql, params): # With MySQLdb, cursor objects have an (undocumented) "_executed" # attribute where the exact query sent to the database is saved. # See MySQLdb/cursors.py in the source distribution. query = getattr(cursor, '_executed', None) if query is not None: query = query.encode(errors='replace') return query

因为不同版本的Django中,decode在不同的行,所以,大家可以自行搜索一下decode的具体位置,再进行修改。

现在,我们再运行一下

F:\MyStudio\PythonStudio\goatbishop.project01\Django\mywebsite_db>python manage.py makemigrationsNo changes detected

很好!问题被完美解决!

好的,我们继续运行下面这段代码:

F:\MyStudio\PythonStudio\goatbishop.project01\Django\mywebsite_db>python manage.py migrate

运行完毕后,它生成了这么一坨文件:

Operations to perform: Apply all migrations: admin, auth, contenttypes, sessionsRunning migrations: Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying admin.0002_logentry_remove_auto_add... OK Applying admin.0003_logentry_add_action_flag_choices... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK Applying auth.0004_alter_user_username_opts... OK Applying auth.0005_alter_user_last_login_null... OK Applying auth.0006_require_contenttypes_0002... OK Applying auth.0007_alter_validators_add_error_messages... OK Applying auth.0008_alter_user_username_max_length... OK Applying auth.0009_alter_user_last_name_max_length... OK Applying auth.0010_alter_group_name_max_length... OK Applying auth.0011_update_proxy_permissions... OK Applying sessions.0001_initial... OK

现在,我们到mysql中查看一下mywebdb数据库中的数据表:

mysql> show tables;+----------------------------+| Tables_in_mywebdb |+----------------------------+| auth_group || auth_group_permissions || auth_permission || auth_user || auth_user_groups || auth_user_user_permissions || django_admin_log || django_content_type || django_migrations || django_session |+----------------------------+10 rows in set (0.00 sec)

很好,多了一堆数据表,这些数据表是Django帮我们创建的。

当我们看到这一堆数据表时,就表示,我们已经配置完成了!

模型(Model)

在MTV设计模式中,存在一个Model,它不是直接的数据库,而是属于服务器端的组成部分,Model可以和数据库进行交互,所以,我们不需要直接操纵数据库,而是操作模型就可以了。

模型概述

模型是提供数据信息的数据库接口。模型是数据的唯一的、确定的信息源。它包含我们所储存数据的必要字段和行为。通常,每个模型对应数据库中唯一的一张表。每个模型的实例对应数据表中的一条记录。模型说明:

每个模型都是一个Python类,每个模型都是django.db.models.Model的子类每一个模型都代表数据库中的一个表Django为我们提供一个自动生成的数据库访问API,也就是说我们不需要使用sql语句,而只需要使用这些类,这样就免去了直接使用sql语句的麻烦。

python数据库模型-Models

ORM框架

ORM(Object Relationship Mapping)即对象关系映射,它允许我们使用类和对象对数据库进行交互。对象关系映射是指,我们表面上操作的是对象,实际上操作的是数据库。

ORM三大特征

表到类的映射数据类型的映射关系映射

案例

我们在mywebdb工程下创建一个名为bookstore的应用:

F:\MyStudio\PythonStudio\goatbishop.project01\Django\mywebsite_db>python manage.py startapp bookstore

并将其注册到settings.py中:

INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'bookstore',]

我们看到,bookstore文件夹下有一个models.py:

这个models.py就是专门用来存放模型的。

我们在models.py模块中创建一个Book类(表),并定义一个字段(title):

from django.db import models# Create your models here.class Book(models.Model): title = models.CharField("书名", max_length = 30)

Now! 我们在cmd中更新一下迁移文件:

F:\MyStudio\PythonStudio\goatbishop.project01\Django\mywebsite_db>python manage.py makemigrations

输出:

Migrations for 'bookstore': bookstore\migrations\0001_initial.py - Create model Book

可以看到,Django创建了一个模型Book,并且在 bookstore\migrations路径下创建了一个​​0001_initial.py​​文件,现在,我们看一看这个文件:

# Generated by Django 2.2.13 on 2020-06-18 13:57from django.db import migrations, modelsclass 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')), ('title', models.CharField(max_length=30, verbose_name='书名')), ], ), ]

可以看到,Django帮我们创建了一个模型叫Book,其中包含两个字段(id和title)。

需要注意的是,此时,我们的mywebdb数据库中没有发生任何改变。

OK!我们回到cmd中,执行迁移:

F:\MyStudio\PythonStudio\goatbishop.project01\Django\mywebsite_db>python manage.py migrate

输出:

Operations to perform: Apply all migrations: admin, auth, bookstore, contenttypes, sessionsRunning migrations: Applying bookstore.0001_initial... OK

此时,我们回到mywebdb数据库,显示数据表,发现多了一个数据表bookstore_book:

mysql> show tables;+----------------------------+| Tables_in_mywebdb |+----------------------------+| auth_group || auth_group_permissions || auth_permission || auth_user || auth_user_groups || auth_user_user_permissions || bookstore_book || django_admin_log || django_content_type || django_migrations || django_session |+----------------------------+11 rows in set (0.00 sec)

我们desc一下这张数据表:

mysql> desc bookstore_book;+-------+-------------+------+-----+---------+----------------+| Field | Type | Null | Key | Default | Extra |+-------+-------------+------+-----+---------+----------------+| id | int(11) | NO | PRI | NULL | auto_increment || title | varchar(30) | NO | | NULL | |+-------+-------------+------+-----+---------+----------------+2 rows in set (0.00 sec)

可以看到两个字段,一个id字段,它是主键,且是自增字段;还有一个是title字段,它是我们自己设定的字段。

此时,我们想在模型文件models.py中再加入一个字段(pub):

from django.db import models# Create your models here.class Book(models.Model): title = models.CharField("书名", max_length = 30) pub = models.CharField("出版社名", max_length = 50,null = True)

注意!只要我们修改了模型类,就必须要进行迁移:

F:\MyStudio\PythonStudio\goatbishop.project01\Django\mywebsite_db>python manage.py makemigrationsMigrations for 'bookstore': bookstore\migrations\0002_book_pub.py - Add field pub to bookF:\MyStudio\PythonStudio\goatbishop.project01\Django\mywebsite_db>python manage.py migrateOperations to perform: Apply all migrations: admin, auth, bookstore, contenttypes, sessionsRunning migrations: Applying bookstore.0002_book_pub... OK

此时在查看mywebdb数据库中的bookstore_book表:

mysql> desc bookstore_book;+-------+-------------+------+-----+---------+----------------+| Field | Type | Null | Key | Default | Extra |+-------+-------------+------+-----+---------+----------------+| id | int(11) | NO | PRI | NULL | auto_increment || title | varchar(30) | NO | | NULL | || pub | varchar(50) | YES | | NULL | |+-------+-------------+------+-----+---------+----------------+3 rows in set (0.01 sec)

Very well!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Django(part4)--练习及re_path方法(django的path函数和url函数)
下一篇:mysql+mybatis下全文搜索的使用方法
相关文章

 发表评论

暂时没有评论,来抢沙发吧~