Django学习笔记(4)——Django连接数据库
前言
在MVC或者MTV设计模式中,模型(M)代表对数据库的操作。那么如何操作数据库呢?本小节就认真学习一下。首先复习一下Django的整个实现流程 ,然后再实现一下使用数据库的整个流程,最后学习一下连接数据库需要了解的知识。
其实之前已经有学习过,可以参考博客:Django学习笔记:初始Django
但是这里想详细的进行学习,首先对Django 一些基本的知识点进行了解。
1,Django的流程实现
django
#安装: pip3 install django 添加环境变量 #1 创建project
django-admin startproject mysite ---mysite ---settings.py
---url.py
---wsgi.py ---- manage.py(启动文件) #2 创建APP
python mannage.py startapp app01 #3 settings配置 TEMPLATES STATICFILES_DIRS=(
os.path.join(BASE_DIR,"template"),
) STATIC_URL = '/static/'
# 我们只能用 STATIC_URL,但STATIC_URL会按着你的 STATICFILES_DIRS去找 #4 根据需求设计代码
url.py
view.py #5 使用模版
render(req,"index.html") #6 启动项目
python manage.py runserver 127.0.0.1:8090 #7 连接数据库,操作数据
model.py
2,代码填充
根据需求,我们先完成主程序(也就是mysite/urls.py)的内容:
from mysql01 import views # admin 后台的路由,先注释掉
urlpatterns = [
path('admin/', admin.site.urls),
# 你的路由,重点是引号中的正则表达式和后面的业务逻辑函数
path('index/',views.index),
# url(r'index/',views.index),
]
注意:关于django.urls path 和django.conf.urls url 的区别,django中 url 和 path 都是配置路径,有什么不同呢?
path 和 url 是两个不同的模块,效果都是响应返回页面,path调用的是python第三方模块或者框架,而url则是自定义的模块。
当然,主要问题在于版本: 1.x版本用url 2.x 版本用path
再填充我们APP的views
from django.shortcuts import render # Create your views here.
def index(req):
return render(req,'index.html')
完成自己写的index.html文件(随便写的,内容如下)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>test</title>
</head>
<body>
<h1 style='background-color: antiquewhite;color:black;'>hello world</h1>
<h1>用户输入</h1>
<form action="/index/" method="post">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit" value="提交">
</form> </body> </html>
当你写入一个HTML文件在templates中,为了让Django知道我们的HTML文件在哪里,需要修改settings文件的相应内容,但是默认情况下,他正好使用,无需修改,除非特殊情况。
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
# 要是有这一行,如果已经存在请保持原样
'DIRS': [os.path.join(BASE_DIR, 'templates')]
,
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
3,运行程式
直接输出下面代码即可运行Django:
python manage.py runserver
在浏览器输入下面代码即可显示index.html内容:
127.0.0.1:8000/index
一,使用Django自带的sqlite3数据库
Django通过自带的ORM框架可以操作数据库,并且自带轻量级的sqlite3数据库,Django默认使用SQLite数据库,因为Python源生支持SQLite数据库,所以我们无需安装任何程式,就可以直接使用,下面我们先练习一下。
1.1 在settings中,配置数据库相关参数
因为是自带的sqlite,所以无需修改,这里我们看一下:
# Database
# https://docs.djangoproject.com/en/2.1/ref/settings/#databases DATABASES = {
'default': {
# 这里可以指定使用的数据库类型,例如mysql
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
1.2 编译models.py
Django通过自定义python类的形式来定义具体的模型,每个模型的物理存在方式就是一个python的Class,每个模型代表数据库中的一张表,每个类的实例代表数据库中的一行数据,类中的每个变量代表数据库中的一列字段。
Django通过模型,将python代码和数据库操作结合起来,实现对SQL查询语言的封装。也就是说,你可以不会管理数据库,可以不会SQL语言,你同样能通过python的代码进行数据库的操作。DJango通过ORM对数据库进行操作,下面直接看代码:
from django.db import models # Create your models here.
class UserInfo(models.Model):
'''
创建两个字段,最大长度是32,类型是char
'''
user = models.CharField(max_length= 32)
pwd = models.CharField(max_length= 32)
这里我们创建了两个字段,分别保存用户的名称和密码。
上面的代码,相当于下面的原生SQL语句。
CREATE TABLE UserInfo (
"id" serial NOT NULL PRIMARY KEY,
"user" varchar(30) NOT NULL,
"pwd" varchar(30) NOT NULL
);
注意:
- Django默认自动创建自增主键ID,当然也可以自己指定主键。
- 上面的SQL语法基于PostgreSQL
更多字段和参数
每个字段有一些特有的参数,例如,CharField 需要 max_length 参数来指定VARCHAR 数据库字段的大小。还有一些适用于所有字段的通用参数。这些参数在文档中有详细定义,这里我们学习一下最常用的:
<1> CharField
字符串字段, 用于较短的字符串.
CharField 要求必须有一个参数 maxlength, 用于从数据库层和Django校验层
限制该字段所允许的最大字符数. <2> IntegerField
#用于保存一个整数. <3> FloatField
一个浮点数. 必须 提供两个参数: 参数 描述
max_digits 总位数(不包括小数点和符号)
decimal_places 小数位数
举例来说, 要保存最大值为 999 (小数点后保存2位),你要这样定义字段: models.FloatField(..., max_digits=5, decimal_places=2)
要保存最大值一百万(小数点后保存10位)的话,你要这样定义: models.FloatField(..., max_digits=19, decimal_places=10)
admin 用一个文本框(<input type="text">)表示该字段保存的数据. <4> AutoField
一个 IntegerField, 添加记录时它会自动增长. 你通常不需要直接使用这个字段;
自定义一个主键:my_id=models.AutoField(primary_key=True)
如果你不指定主键的话,系统会自动添加一个主键字段到你的 model. <5> BooleanField
A true/false field. admin 用 checkbox 来表示此类字段. <6> TextField
一个容量很大的文本字段.
admin 用一个 <textarea> (文本区域)表示该字段数据.(一个多行编辑框). <7> EmailField
一个带有检查Email合法性的 CharField,不接受 maxlength 参数. <8> DateField
一个日期字段. 共有下列额外的可选参数:
Argument 描述
auto_now 当对象被保存时,自动将该字段的值设置为当前时间.通常用于表
示 "last-modified" 时间戳.
auto_now_add 当对象首次被创建时,自动将该字段的值设置为当前时间.
通常用于表示对象创建时间.
(仅仅在admin中有意义...) <9> DateTimeField
一个日期时间字段. 类似 DateField 支持同样的附加选项. <10> ImageField
类似 FileField, 不过要校验上传对象是否是一个合法图片.#它有两个可选参
数:height_field和width_field,
如果提供这两个参数,则图片将按提供的高度和宽度规格保存. <11> FileField
一个文件上传字段.
要求一个必须有的参数: upload_to, 一个用于保存上载文件的本地文件系统路径.
这个路径必须包含 strftime #formatting,
该格式将被上载文件的 date/time
替换(so that uploaded files don't fill up the given directory).
admin 用一个<input type="file">部件表示该字段保存的数据(一个文件上传部件) . 注意:在一个 model 中使用 FileField 或 ImageField 需要以下步骤:
(1)在你的 settings 文件中, 定义一个完整路径给 MEDIA_ROOT 以便让
Django在此处保存上传文件.
(出于性能考虑,这些文件并不保存到数据库.) 定义MEDIA_URL 作为该目录
的公共 URL. 要确保该目录对
WEB服务器用户帐号是可写的.
(2) 在你的 model 中添加 FileField 或 ImageField, 并确保定义了
upload_to 选项,以告诉 Django
使用 MEDIA_ROOT 的哪个子目录保存上传文件.你的数据库中要保存的只是
文件的路径(相对于 MEDIA_ROOT).
出于习惯你一定很想使用 Django 提供的 get_<#fieldname>_url 函数.举
例来说,如果你的 ImageField
叫作 mug_shot, 你就可以在模板中以 {{ object.#get_mug_shot_url }}
这样的方式得到图像的绝对路径. <12> URLField
用于保存 URL. 若 verify_exists 参数为 True (默认), 给定的 URL 会预先检查是否
存在( 即URL是否被有效装入且
没有返回404响应).
admin 用一个 <input type="text"> 文本框表示该字段保存的数据(一个单行编辑框) <13> NullBooleanField
类似 BooleanField, 不过允许 NULL 作为其中一个选项. 推荐使用这个字段而不要用
BooleanField 加 null=True 选项
admin 用一个选择框 <select> (三个可选择的值: "Unknown", "Yes" 和 "No" )
来表示这种字段数据. <14> SlugField
"Slug" 是一个报纸术语. slug 是某个东西的小小标记(短签), 只包含字母,数字,下划线
和连字符.#它们通常用于URLs
若你使用 Django 开发版本,你可以指定 maxlength. 若 maxlength 未指定, Django
会使用默认长度: 50. #在
以前的 Django 版本,没有任何办法改变50 这个长度.
这暗示了 db_index=True.
它接受一个额外的参数: prepopulate_from, which is a list of fields from which to auto-#populate
the slug, via JavaScript,in the object's admin form: models.SlugField
(prepopulate_from=("pre_name", "name"))prepopulate_from 不接受 DateTimeFields. <13> XMLField
一个校验值是否为合法XML的 TextField,必须提供参数: schema_path, 它是一个
用来校验文本的 RelaxNG schema #的文件系统路径. <14> FilePathField
可选项目为某个特定目录下的文件名. 支持三个特殊的参数, 其中第一个是必须提供的.
参数 描述
path 必需参数. 一个目录的绝对文件系统路径. FilePathField 据此得到可选项目.
Example: "/home/images".
match 可选参数. 一个正则表达式, 作为一个字符串, FilePathField 将使用它过滤文件名.
注意这个正则表达式只会应用到 base filename 而不是
路径全名. Example: "foo.*\.txt^", 将匹配文件 foo23.txt 却不匹配 bar.txt 或 foo23.gif.
recursive可选参数.要么 True 要么 False. 默认值是 False. 是否包括 path 下面的全部子目录.
这三个参数可以同时使用.
match 仅应用于 base filename, 而不是路径全名. 那么,这个例子:
FilePathField(path="/home/images", match="foo.*", recursive=True)
...会匹配 /home/images/foo.gif 而不匹配 /home/images/foo/bar.gif <15> IPAddressField
一个字符串形式的 IP 地址, (i.e. "24.124.1.30"). <16> CommaSeparatedIntegerField
用于存放逗号分隔的整数值. 类似 CharField, 必须要有maxlength参数.
更多参数
(1)null 如果为True,Django 将用NULL 来在数据库中存储空值。 默认值是 False. (1)blank 如果为True,该字段允许不填。默认为False。
要注意,这与 null 不同。null纯粹是数据库范畴的,而 blank 是数据验证范畴的。
如果一个字段的blank=True,表单的验证将允许该字段是空值。如果字段的blank=False,该字段就是必填的。 (2)default 字段的默认值。可以是一个值或者可调用对象。如果可调用 ,每有新对象被创建它都会被调用。 (3)primary_key 如果为True,那么这个字段就是模型的主键。如果你没有指定任何一个字段的primary_key=True,
Django 就会自动添加一个IntegerField字段做为主键,所以除非你想覆盖默认的主键行为,
否则没必要设置任何一个字段的primary_key=True。 (4)unique 如果该值设置为 True, 这个数据字段的值在整张表中必须是唯一的 (5)choices
由二元组组成的一个可迭代对象(例如,列表或元组),用来给字段提供选择项。
如果设置了choices ,默认的表单将是一个选择框而不是标准的文本框,而且这
个选择框的选项就是choices 中的选项。
1.3 在终端创建表
我们需要在pycharm的teminal中通过命令创建数据库的表,有两条命令,分别是:
生成同步数据库的脚本代码
python manage.py makemigrations
通过运行makemigrations 命令,相当于告诉Django,你对模型有改动,并且你想把这些改动保存为一个“迁移”(migration)。
运行后,结果如下:
Migrations for 'mysql01':
mysql01\migrations\0001_initial.py
- Create model UserInfo
migrations是Django保存模型修改记录的文件,这些文件保存在磁盘上,从上面可以看到,它就是 mysql01\migrations\0001_initial.py 。我们可以打开这个文件看一下,里面保存的都是可读并且可编译的内容,方便我们随时手动修改。
下面看一下0001_initial.py内容:
# Generated by Django 2.1.7 on 2019-03-12 01:45 from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [
] operations = [
migrations.CreateModel(
name='UserInfo',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('user', models.CharField(max_length=32)),
('pwd', models.CharField(max_length=32)),
],
),
]
同步数据库(也就是对数据库执行真正的迁移动作)脚本代码
python manage.py migrate
migrate命令对所有还未实施的迁移记录进行操作,本质上就是将你对模型的修改体现到数据库中具体的表上面。Django通过一张叫做django_migrations的表,记录并跟踪已经实施的migrate动作,通过对比获得哪些migrations尚未提交。
运行后,结果如下:
Operations to perform:
Apply all migrations: admin, auth, contenttypes, mysql01, sessions
Running migrations:
Applying mysql01.0001_initial... OK
注意:在开发过程中,数据库同步误操作之后,难免会遇到后面不能同步成功的情况,解决这个问题的一个简单粗暴方法是把migrations目录下的脚本(除__init__.py之外)全部删掉,再把数据库删掉之后创建一个新的数据库,数据库同步操作再重新做一遍。
所以我们需要为进入这个项目的后台创建超级管理员:
python manage.py createsuperuser
设置好用户名和密码后便可登录啦!
二,使用MySQL数据库
下面学习MySQL数据库连接Django。
1,打开MySQL命令对话框,创建表
create database djangomysql default charset=utf8;
在使用非SQLite的数据库时候,请务必预先在数据库管理系统的提示符交互模式下创建数据库,我们可以使用命令:“CREATE DATABASE database_name;”。Django不会自动帮你做这一步工作。
2,创建一个APP
python manage.py startapp mysql02
3,修改Django中settings.py的相关参数,配置MySQL
添加mysql02这个APP
INSTALLED_APPS = [
'django.contrib.admin', #admin后台管理站点
'django.contrib.auth', # 身份认证系统
'django.contrib.contenttypes', # 内容类型框架
'django.contrib.sessions', # 回话框架
'django.contrib.messages', # 消息框架
'django.contrib.staticfiles', # 静态文件管理框架
'mysql02',
]
注释SQLite,配置MySQL
DATABASES = {
'default': {
# 这里可以指定使用的数据库类型,例如mysql
'ENGINE': 'django.db.backends.mysql',
'NAME': 'djangomysql',
'USER':'root',
'PASSWORD':'******',
'HOST':'localhost',
'PORT':'3306',
}
}
或者这样写:
# mysite/settings.py # Database
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases import pymysql # 一定要添加这两行!通过pip install pymysql!
pymysql.install_as_MySQLdb() DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mysite',
'HOST': '192.168.1.1',
'USER': 'root',
'PASSWORD': 'pwd',
'PORT': '3306',
}
}
4,安装MySQL-python
必须先按照MySQLdb,不然会报如下的错误:
ModuleNotFoundError: No module named 'MySQLdb'
Django连接mysql默认驱动是MySQLdb,MySQLdb没有支持python3的版本,如果使用python3.x版本的时候,Django连接mysql的方法是使用pymysql替换MySQLdb。
在配置文件同目录下的__init__.py文件中加入以下代码(本文就是mysite下的__init__.py):
import pymysql pymysql.install_as_MySQLdb()
使用myslqclient代替MySQLdb,mysqlclient项目在github上的地址为 https://github.com/PyMySQL/mysqlclient-python,该项目fork MySQLdb,加入了对python3的支持。
安装如下:
pip install pymysql
没有提示MySQLdb模块找不到,说明按照OK。
5,编译models.py
Django通过自定义python类的形式定义具体的模型,每个模型代表数据库中的一张表,每个类的实例代表数据表中的一行数据,类中的每个变量代表数据表中的一列字段。
from django.db import models # Create your models here.
class Userinfo(models.Model):
'''
创建两个字段,最大长度为32,类型是char
'''
user = models.CharField(max_length= 32)
pwd = models.CharField(max_length= 32)
6,在终端创建数据库的表
我们需要先生成同步数据库的脚本代码:
python manage.py makemigrations
执行结果如下:
Migrations for 'mysql02':
mysql02\migrations\0001_initial.py
- Create model Userinfo
然后同步数据库(也就是对数据库执行真正的迁移动作)
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 sessions.0001_initial... OK
7,查看mysql数据库
在MySQL中,进入创建的库中,查看我们在Django创建的表:
三,在pycharm上操作MySQL
pycharm可以创建,读写数据库,不过如果想与工程相连,还是需要在工程中用代码链接,单击Database侧边栏位。添加Database,如下图:
点击“+”,然后点击Data Sources,进入设置界面。如下:
然后填写连接信息,Database栏可以填写具体数据库名称,不填写则加载所有数据库。第一次使用PyCharm时会提示设置操作木马,填写完成后可以点击“Test Connection”,测试连接情况,没有问题,点击OK,输入操作木马即可完成连接。
注意:这里必须注意下载missing dirver files。
右侧为MySQL目录,如果修改,查看没有找到自己的数据库,点击“more schemes”,如图:
可以在命令行直接操作数据库,如图:
结果如下:
双击table1,可以图形化显示数据表:
显示结果如下:
四,python操作MySQL
具体请参考博文:Python:python操作MySQL
在Python环境下的操作,我们必然是通过写Python代码的方式。但是Python和数据库语言SQL是两码事,它根本无法操作数据库,没关系,我们可以在Python代码中嵌入SQL语句,比如下面的方式:
# 创建连接,这里先忽略创建方法
conn = ......
# 创建游标
cursor = conn.cursor() # 执行SQL,并返回收影响行数
effect_row = cursor.execute("insert into host (hostname,port,ip) values('ubuntu','22','10.0.0.2');") # 提交,不然无法保存新建或者修改的数据
conn.commit() # 关闭游标
cursor.close()
# 关闭连接
conn.close()
所以问题来了,python如何创建和数据库的链接呢?这里我们使用pymysql这一类的第三方模块(针对不同的数据库,有不同的模块),于是我们有下面的链接:
conn = pymysql.connect(host='137.78.5.130', port=3306, user='root',
passwd='123456', db='test')
大多数程序员不是专业的DBA,所以SQL写的很烂也正常,那么出错问题如何解决呢?
Python语法可以解决这个问题,我们使用Python语法来写,然后使用一个中间工具将Python代码翻译成原生的SQL语句,而这个中间工具就是所谓的ORM(对象关系映射)!
ORM将一个Python的对象映射为数据库中的一张关系表。它将SQL封装起来,程序员不再需要关心数据库的具体操作,只需要专注于自己本身的代码和业务逻辑的实现。
于是整体的流程就是:Python代码,通过ORM转换成SQL语句,再通过pymysql去实际操作数据库。
Django自带ORM系统,不需要额外的安装别的ORM。当然也可以安装并使用其他的ORM,比如SQLAlchemy。但是不建议这么做,因为Django系统庞大,集成完善,模型层与视图层,模板层结合的比较紧密。
五,django.db.utils.ProgrammingError: (1146, u"Table'' doesn't exist")解决办法
5.1 现象
在数据库中删除了一张表,重新执行python manage.py migrate 时报错,提示不存在这张表
5.2 原因
主要是因为Django一般在第一次迁移的时候新建表,后面都不会新建表,而是只检查字段等等的变化,所以我们既然已经删除了这张表,django检查这张表的字段变化的时候自然报错了。
5.3 解决方法
解决方法仍然是执行数据库迁移命令
python manage.py makemigrations python manage.py migrate
只不过在执行上面代码之前,把第一次执行迁移创建的那个记录删除掉,否则它检查到已经执行过第一次了,那么它后面就不会创建表了。
在该APP模块下,有一个migtations文件夹,除了前两个文件外,其他的文件都删除,其实每一次如果有变化的话,这边就会生成一个文件,下面的这个001_initial.py看名字就知道是第一次迁移的时候生成的,也就是因为有它的存在,所以以后每次再执行就不再创建表了。
其次,在数据库里面也有相应的记录,也要删除。我们仔细看看数据库里面存的是什么,在Django_migrations里面,这表里面存的都是每次迁移的记录,当然记录的是什么模块以及对应的文件名字,比如我们这里的模块是dtheme,这里的文件名叫做001_initial,和我们文件夹里面是一一对应的,同样,删除这条记录。
然后在执行数据库迁移命令即可。
注意:如果这个APP模块下面还有其他的model的话,那么其他的model创建的表也要删除掉,相当于我们这样的解决方案是针对整个APP模块的,要执行就会全部重新生成,不然会提示部分表已经存在错误。
六,其他django命令行操作命令
1,清空数据库
python manage.py flush
2,查询某个命令的详细信息
django-admin.py help startapp
admin 是Django 自带的一个后台数据库管理系统。
此时会进入django-admin的内容区:
#!c:\programdata\anaconda3\python.exe
from django.core import management if __name__ == "__main__":
management.execute_from_command_line()
3,启动交互界面
python manage.py shell
这个命令和直接运行 python 进入 shell 的区别是:你可以在这个 shell 里面调用当前项目的 models.py 中的 API,对于操作数据,还有一些小测试非常方便。
4,忘记命令时,可以这样操作
终端上输入python manage.py 可以看到详细的列表,在忘记子名称的时候特别有用。
Type 'manage.py help <subcommand>' for help on a specific subcommand. Available subcommands: [auth]
changepassword
createsuperuser [contenttypes]
remove_stale_contenttypes [django]
check
compilemessages
createcachetable
dbshell
diffsettings
dumpdata
flush
inspectdb
loaddata
makemessages
makemigrations
migrate
sendtestemail
shell
showmigrations
sqlflush
sqlmigrate
sqlsequencereset
squashmigrations
startapp
startproject
test
testserver [sessions]
clearsessions [staticfiles]
collectstatic
findstatic
runserver
5,修改语言
在主程序的settings.py里面查找语言编码,默认是英文的,这里可以修改为中文,此处修改针对的是admin的页面。
LANGUAGE_CODE = 'en-us'# 默认
LANGUAGE_CODE = 'zh-hans'# 改为中文,主要针对admin页面
6,配置模板路径
在项目根目录下添加templates文件夹。
TEMPLATE_DIRS = (
os.path.join(BASE_DIR,'templates'),
)
#然后在项目根目录下添加templates文件夹
六,报错出现django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.2
1,问题描述
使用Python3.6+django2.2+pymysql的时候出现这个问题:
django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.2
据了解,这主要是django2.2内部的一个版本限制在作怪。
2,处理方案
修复源码,因为django2.2和pymysql版本不匹配,所以mysqldb不支持python3.。那么我们可以注销掉下面这句话。
if version < (1, 3, 13):
raise ImproperlyConfigured(‘mysqlclient 1.3.13 or newer is required; you have %s.’ %Database.version)
这段话一般在Python的下面目录:C:\Python37\Lib\site-packages\django\db\backends\mysql(python安装目录)打开base.py,注释掉。
然后在C:\Python37\lib\site-packages\django\db\backends\mysql\operations.py 的146行将下面代码的decode修改为encode。
因为字符串没有decode。
query = query.decode(errors=‘replace’)
参考文献:https://blog.csdn.net/weixin_45476498/article/details/100098297
Django学习笔记(4)——Django连接数据库的更多相关文章
- Django学习笔记之Django中间件
准备 我们在前面的课程中已经学会了给视图函数加装饰器来判断是用户是否登录,把没有登录的用户请求跳转到登录页面.我们通过给几个特定视图函数加装饰器实现了这个需求.但是以后添加的视图函数可能也需要加上装饰 ...
- Django学习笔记之Django Form表单
Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...
- Django学习笔记之Django QuerySet的方法
一般情况下,我们在写Django项目需要操作QuerySet时一些常用的方法已经满足我们日常大多数需求,比如get.filter.exclude.delete神马的感觉就已经无所不能了,但随着项目但业 ...
- Django学习笔记-修改Django的默认的数据库
1.修改设置settings中的配置 DATABASES = { 'default': { # 'ENGINE': 'django.db.backends.sqlite3', # 'NAME': os ...
- Django 学习笔记之五 Django中数据库中ManyToManyField及ForeignKey
1.model里面的代码: from __future__ import unicode_literalsimport django.utils.timezone as timezonefrom dj ...
- Django学习笔记之Django Form表单详解
知识预览 构建一个表单 在Django 中构建一个表单 Django Form 类详解 使用表单模板 回到顶部 构建一个表单 假设你想在你的网站上创建一个简单的表单,以获得用户的名字.你需要类似这样的 ...
- Django学习笔记之Django的url反向解析
0x00 URL反向解析和三种不同的反向解析方式 Django中提供了关于URL的映射的解决方案,可以做两个方向的使用: 1.普通解析过程:由客户端的浏览器发起一个url请求,Django根据URL解 ...
- Django学习笔记之Django ORM Aggregation聚合详解
在当今根据需求而不断调整而成的应用程序中,通常不仅需要能依常规的字段,如字母顺序或创建日期,来对项目进行排序,还需要按其他某种动态数据对项目进行排序.Djngo聚合就能满足这些要求. 以下面的Mode ...
- Django学习笔记之Django ORM相关操作
一般操作 详细请参考官方文档 必知必会13条 <> all(): 查询所有结果 <> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <> ...
- Django学习笔记之Django视图View
一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. ...
随机推荐
- 基于.net的Socket异步编程总结
最近在为公司的分布式服务框架做支持异步调用的开发,这种新特性的上线需要进行各种严格的测试.在并发性能测试时,性能一直非常差,而且非常的不稳定.经过不断的分析调优,发现Socket通信和多线程异步回调存 ...
- 各个模块的刷新js
// 更新页面中的subgrid function refreshSubGrid(subgridName) { Xrm.Page.ui.controls.get(subgridName).refres ...
- 2.9 linux学习(1)
2019-2-9 16:07:44 学一下Linux,多学一点东西 新认识个老师,超哥 很牛逼感觉! https://www.cnblogs.com/pyyu/p/9276851.html 这是入门参 ...
- Vue 中动态添加class(使用v-bind:class)
今天在Vue中动态修改类名,元素的样式就是不改变,类名也没有加上去,里面的问题具体我还是不太清楚,有可能是因为自己不认真,把 :class= 后面的内容的格式给整错了,下面将正确的做法记录一下,便于以 ...
- js生成自定义随机数方法
function getRandom() { var chars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', ...
- pip和cmd常用命令
1.pip常用命令 显示模块的详情 pip show 安装模块 pip install 模块名称 卸载模块 pip uninstall 模块名称 查看当前环境 ...
- 关于Java 去除空格,换行的代码
public static String replaceBlank(String str) { String dest = ""; if (str != null) { //Pat ...
- Revisiting Network Support for RDMA
重新审视RDMA的网络支持 本文为SIGCOMM 2018会议论文. 笔者翻译了该论文.由于时间仓促,且笔者英文能力有限,错误之处在所难免:欢迎读者批评指正. 本文及翻译版本仅用于学习使用.如果有任何 ...
- 1.6 Why only in China?
Android plug-in is in full swing in China, why is it silent in foreign countries? The applications o ...
- SQL 查询当前时间
Mysql: select date_format(now(),'%Y-%m-%d'); Oracle: Oracle中如何获取系统当前时间进行语句的筛选是SQL语句的常见功能 获取系统当前时间dat ...