在文件:"E:\Python_project\P_001\myshop-test\myshop\myshop\settings.py"中写入以下数据库的配置信息:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'shop-test',
'USER': 'shop-test',
'PASSWORD': 'Aa_123456',
'HOST': 'localhost',
'PORT': '3306',
# 取消外键约束,否则多对多模型迁移报django.db.utils.IntegrityError: (1215, 'Cannot add foreign key constraint')
'OPTIONS': {
"init_command": "SET foreign_key_checks = 0;",
'charset': 'utf8'
},
}
}
上面的代码比较好理解,就是对于语句:django.db.backends.mysql
作一些说明:
在Django中,'django.db.backends.mysql'
是一个数据库后端引擎的路径,用于指定使用MySQL作为数据库的后端。数据库后端引擎是Django用于与不同类型的数据库进行交互的组件。它提供了对数据库的连接、查询和数据操作的支持。
Django支持多个数据库后端引擎,例如MySQL、PostgreSQL、SQLite等。通过设置'ENGINE'
选项,你可以指定使用的具体后端引擎。在这个例子中,'django.db.backends.mysql'
表示使用MySQL作为数据库后端引擎。
通过选择不同的后端引擎,你可以使用不同类型的数据库来存储和检索数据,而Django提供的ORM(对象关系映射)功能将为你提供一致的数据访问接口,无论使用的是哪种数据库后端引擎。这样,你可以方便地切换和管理不同类型的数据库,而无需更改大量的代码。
在上面的配置中还取消了外键约束,否则在“多对多”模型关系的迁移中会出现下面的提示:
django.db.utils.IntegrityError:(1215, 'Cannot add foreign key constraint')
如果需要配置输出对应的数据库语句(*),则需要在"E:\Python_project\P_001\myshop-test\myshop\myshop\settings.py"写入下面的配置语句:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}
上面的日志输出配置代码中的语句“‘disable_existing_loggers’: False,”是什么意思?
答:在Django的日志配置中,'disable_existing_loggers'
是一个布尔值选项,用于指定是否禁用现有的日志记录器。它的作用是控制是否保留已经存在的日志记录器,而不是完全替换它们。
当'disable_existing_loggers'
设置为True
时,将禁用现有的日志记录器。这意味着,在日志配置中定义的新的日志记录器会生效,而现有的日志记录器将被忽略。这通常用于完全替换默认的Django日志配置。
当'disable_existing_loggers'
设置为False
时,保留现有的日志记录器。这意味着,新的日志记录器将与现有的记录器一起使用,不会替换它们。这通常用于扩展默认的Django日志配置,添加额外的日志记录器或修改现有记录器的行为。
在给定的配置语句中,'disable_existing_loggers': False
表示不禁用现有的日志记录器,而是保留它们,并将新的日志记录器添加到现有的记录器集合中。这样可以确保现有的Django数据库后端日志记录器仍然有效,并将日志输出发送到控制台。
语句: ‘propagate’: True, 是什么意思?
答:在Django的日志配置中,'propagate'
是一个布尔值选项,用于指定日志消息是否应该传播给更高级别的日志记录器。
当'propagate'
设置为True
时,日志消息将传播给父级日志记录器。这意味着,如果当前的日志记录器无法处理日志消息,它将将消息传递给其父级记录器,以便其处理或传递给更高级别的记录器。传播使得日志消息可以在整个日志记录器层次结构中进行传递和处理。
当'propagate'
设置为False
时,日志消息不会传播给父级日志记录器。如果当前的日志记录器无法处理日志消息,消息将被静默丢弃,不会传递给更高级别的记录器。
在给定的配置语句中,'propagate': True
表示日志消息将传播给父级记录器。这意味着,如果'django.db.backends'
记录器无法处理日志消息,它将传递给更高级别的记录器进行处理。通过设置为True
,你可以确保数据库后端日志消息在整个日志记录器层次结构中传播,以便根据需要进行处理或记录。
安装命令如下(安装前注意把代理工具关掉 ):
pip install -i https://mirrors.aliyun.com/pypi/simple mysqlclient
在这里,可以用小皮面板来安装Mysql,当然也可以自己去Mysql的官网去下载安装包安装。
如果是用小皮面板来安装Mysql,则可以参考我之前写的博文:
https://blog.csdn.net/wenhao_ir/article/details/126170178
安装好后启动Mysql的服务:
然后切换到数据库,按第01步中的配置代码中的信息新建一个数据库:
在"“E:\Python_project\P_001\myshop-test\myshop\app1\models.py”"中写入下面的内容:
from django.db import models
# Create your models here.
class User(models.Model):
username = models.CharField(max_length=50)
email = models.EmailField(unique=True)
# 其他字段...
def __str__(self):
return self.username
关于为什么在Django中把数据库的生成称为叫迁移?请参看我写的另一篇博文,https://blog.csdn.net/wenhao_ir/article/details/131544152
通过下面的几条命令生成“迁移执行文件”:
CD E:\Python_project\P_001\myshop-test\myshop\
E:
manage.py makemigrations
上面的命令正常的话运行结果如下所示:
打开文件:“E:\Python_project\P_001\myshop-test\myshop\app1\migrations\0001_initial.py”
可以看到文件中包含当前模型的创建语句,0001_initial.py的内容如下:
# Generated by Django 3.2.10 on 2023-07-05 13:32
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='User',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('username', models.CharField(max_length=50)),
('email', models.EmailField(max_length=254, unique=True)),
],
),
]
接上一步,用下面的三条语句实现执行数据库模型的迁移。
CD E:\Python_project\P_001\myshop-test\myshop\
E:
manage.py migrate
可以用工具“opendbviewer”查看数据库。
这个工具的百度网盘下载链接如下:
https://pan.baidu.com/s/19VxBiWHPmuJ_ApVgI3bqhA?pwd=e1te
安装完成后,连接数据库后就可以查看数据库了~如下图所示:
在路径:E:\Python_project\P_001\myshop-test\myshop\下新建文件 sql_test.py(与manage.py平级):
然后写入下面的代码:
import os
import django
# 设置Dango运行时需要的环境变量DJANGO_SETTINGS_MODULE
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myshop.settings')
# 加载Django的设置
django.setup()
# 导入模型,注意必须在加载完Django的设置后下面的这句导入模型语句才能被正确执行
from app1.models import User
# 创建一个用户
user = User(username='john', email='[email protected]')
user.save()
对于语句os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myshop.settings')
的解释:
当我们在Python中运行Django项目时,需要告诉Django要使用的项目设置(settings)。这些设置包括数据库配置、应用程序列表、静态文件路径等等。
怎么告诉Django项目的设置(settings)呢?通过环境变量 DJANGO_SETTINGS_MODULE 告诉。
在这里,os.environ.setdefault(key, value)
是设置一个环境变量的方法。它接受两个参数:key
是要设置的环境变量的名称,value
是要为该环境变量设置的值。
'DJANGO_SETTINGS_MODULE'
刚才已经说了它的作用,'myshop.settings'
是设置变量的值,表示Django应该使用myshop
项目中的settings.py
文件作为项目的设置。
执行上面的代码即可向数据库写入数据,执行后我们再去看数据库的记录:
我们发现,在数据库shop-test的表User中已经有了一条新的记录。
我们再运行下面的代码,另外再写入一条新的记录:
import os
import django
# 设置Dango运行时需要的环境变量DJANGO_SETTINGS_MODULE
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myshop.settings')
# 加载Django的设置
django.setup()
# 导入模型
from app1.models import User
# 创建一个用户
user = User(username='suwenhao', email='2487872782.com')
user.save()
https://pan.baidu.com/s/1mmNZyyV9lrmsTc0s1GvW1Q?pwd=i6g9