当前位置 : 主页 > 编程语言 > python >

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

来源:互联网 收集:自由互联 发布时间:2022-06-15
学习笔记,仅供参考,有错必纠 文章目录 ​​数据库和模型​​ ​​Django下使用mysql数据库​​ ​​安装pymysql包​​ ​​创建和配置数据库​​ ​​模型(Model)​​ ​​模型概述​

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



文章目录

  • ​​数据库和模型​​
  • ​​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 pymysql
pymysql.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 makemigrations
No changes detected

很好!问题被完美解决!

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

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

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

Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running 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:

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

这个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:57

from django.db import migrations, models


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')),
('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, sessions
Running 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 ma
kemigrations
Migrations for 'bookstore':
bookstore\migrations\0002_book_pub.py
- Add field pub to book

F:\MyStudio\PythonStudio\goatbishop.project01\Django\mywebsite_db>python manage.py mi
grate
Operations to perform:
Apply all migrations: admin, auth, bookstore, contenttypes, sessions
Running 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!

上一篇:Django(part4)--练习及re_path方法
下一篇:没有了
网友评论