多平台统一管理软件接口,如何实现多平台统一管理软件接口
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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~