学习笔记,仅供参考,有错必纠
文章目录
- 数据库和模型
- 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, 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:
这个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, 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 makemigrations
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!