88必发唯一官网 1

Django数据库类库MySQLdb使用详解88必发唯一官网

上一篇博文学习了Django的form和template。到目前为止,我们所涉及的内容都是怎么利用Django在浏览器页面上显示内容。WEB开发除了数据的显示之外,还有数据的存储,本文的内容就是如何在前面所学知识的基础上进一步利用Django和mysql数据库进行数据的存储。
在介绍如何利用Django和数据进行数据存储之前,先说一说Django提供的ORM(Object
Relational Mapping)框架。 Object Relational Mapping
翻译成中文就是“对象关系映射”。这里的“对象”和编程语言中“面向对象编程”中的“对象”是一个概念;“关系”是指关系型数据库中的表(数据库有关系型数据库(mysql)和非关系型数据库(mongodb)),“映射”就是把这两者(“对象”和“关系型数据库的表”)连接起来,这样在进行开发的时候就可以通过操作对象来实现对数据库中表内容的操作。在Django中一个model类一般对应关系数据库中的一张表。概念先讲到这里,要真正理解需要在实际代码中体会。下面步入正题:
### 0 数据库的准备工作 #### 0.1 mysql数据库安装:
`ctrl+Alt+t`打开终端,输入:`sudo apt-get install
mysql-server`安装mysql数据库.安装期间有提示设置root用户的密码,一定要记住自己设置的root密码!!!(博主第一次安装的时候没在意,随便输了一个密码,安装完想不起来了)。mysql安装完之后在终端输入:`mysql
-u root -p`
,会提示需要密码,这时候输入刚才设置的root用户的密码,进入mysql shell
#### 0.2 设置mysql的数据库编码方式:
mysql默认的字符存储编码方式在进行中文存储的时候会出现乱码,在正式使用mysql数据库之前,我们先把编码方式处理好,在mysql
shell 中输入`show variables like ‘%char%’;
`结果应该如下(我的数据库编码已经修改好了,这里只好引用别人的图片了):
![](https://images2018.cnblogs.com/blog/1300456/201805/1300456-20180524183319736-1229593745.png).
这说明数据库的编码方式是latin1.我们需要修改mysql的配置文件把编码方式指定utf-8,mysql的配置文件位于/etc/mysql目录下:
先在mysql shell 中输入`quit`退出MySQL shell.然后输入 `cd /etc/mysql`
进入mysql配置文件目录,`sudo gedit ./my.cnf`
编辑`my.cnf`把文件的配置部分改成下方所示: “` !includedir
/etc/mysql/conf.d/ !includedir /etc/mysql/mysql.conf.d/ [client]
default-character-set=utf8 [mysqld] default-storage-engine=INNODB
character-set-server=utf8 collation-server=utf8_general_ci “`
保存后退出编辑.数据库的编码方式就改成utf8了. 再次输入`mysql -u root -p
`进入mysql shell,输入`create database
DjangoDB`创建一个名为DjangoDB的数据库.创建成功会提示OK. #### 0.3
setting.py设置后台数据库指向
Django默认的数据库是sqlite3,除了sqlite3外Django支持的其他关系型数据库[请看这里](https://docs.djangoproject.com/en/2.0/ref/settings/\#std:setting-DATABASE-ENGINE),但是实际生产环境一般不用sqlite3,这里我们使用mysql作为后台数据库.打开项目文件目录下的setting.py.找到数据库的设置部分:
“`python DATABASES = { ‘default’: { ‘ENGINE’:
‘django.db.backends.sqlite3’,#默认使用sqlite3数据库 ‘NAME’:
os.path.join(BASE_DIR, ‘db.sqlite3’), } } “`
把数据库配置的部分修改为: “`python DATABASES = { ‘default’: {
‘ENGINE’: ‘django.db.backends.mysql’,#使用mysql数据库 ‘NAME’:
‘DjangoDB’,#指向刚才新建的DjangoDB数据库
‘USER’:’root’,#连接数据库时使用的用户名
‘PASSWORD’:’000000′,#连接数据库时用户的密码
‘ALLOWED_HOSTS’:’127.0.0.1′,#数据库所在服务器的IP地址.因为使用的是装在本机的mysql数据库,这里填127.0.0.1
‘PORT’:’3306′,#数据库服务的监听端口号,mysql默认是3306 } } “`
到这里,前期与数据库相关的准备算是做完了. ### 1 定义一个用户model
编辑myBolg文件目录下的`models.py`定义一个用户类,也就是所谓的’对象’:
“`python from django.db import models # Create your models here.
class BlogUser(models.Model): SEX_CHIOCES=( (1,’男’), (2,’女’), )
username=models.CharField(‘用户名’,max_length=100)
email=models.EmailField(‘邮箱地址’,max_length=100)
password=models.CharField(max_length=100)
gender=models.CharField(‘性别’,max_length=30,choices=SEX_CHIOCES)
registedDate=models.DateTimeField(‘注册时间’,auto_now_add=True)#auto_88必发唯一官网,now=True创建用户的同时使用当前时间作为registedDate的值
def __str__(self): return self.username “` 跟视图类,django
form一样,自定义model必须要继承models.Model类.在BlogUser类,我们定义了5个属性:’username’,’email’,’password’,’gender’,’registedDate’.
到这里,我们有了数据库,也定义好了’对象’,下面就是要把他们关联起来了.
### 2 数据库与model的关联和同步 执行`python manage.py
makemigrations`命令,会提示创建一个BlogUser的model.并且在myBlog的migration文件目录下面会生成一个`0001_initial.py`的文件.
接着执行 `python manage.py migrate
`命令.这时候可能会报错,提示是至少需要mysqlclientxxx版本以上当前版本过低.这时候需要安装mysqlclient的最新版.在终端输入`pip
install
mysqlclient`进行安装(如果django版本低于2.0还需要进行额外的操作请看[这里](https://stackoverflow.com/questions/46670329/mysqlclient-1-3-3-or-newer-is-required-you-have-0-7-11-none)).安装完成之后执行\`python
manage.py migrate `输出如下图,则说明数据库的表和model关联起来了:
![](https://images2018.cnblogs.com/blog/1300456/201805/1300456-20180526110355610-1879077489.png).
### 3 TestCase测试
养成定义一个类或者某个方法之后进行单元测试,对开发人员来说是一种良好的习惯.通过上面的步骤我们把model和数据库表联系起来了.接着是做单元测试,编辑myBlog下的`tests.py`文件:
“`python from django.test import TestCase from myBlog.models import
BlogUser #导入BlogUser类 # Create your tests here. class
BlogUserTestCase(TestCase): def
create_test(self):#测试是否能够新建或更新BlogUser
test_user,created=BlogUser.objects.update_or_create(username=’test_blog_user’,email=’test@.163.com’,password=’test’,gender=’M’)
print(test_user) “` 然后在终端执行: `./manage.py test
myBlog.tests.BlogUserTestCase.create_test `
命令,输出如下,说明数据库链接没问题,BlogUser也没问题:
![](https://images2018.cnblogs.com/blog/1300456/201805/1300456-20180526113208693-48630257.png).
更多关于django单元测试的内容[请点这里](https://docs.djangoproject.com/en/2.0/internals/contributing/writing-code/unit-tests/).
### 4.在视图类中使用model
编辑myBlog文件目录下的`views.py`,先导入BlogUser “`python from
myBlog.models import BlogUser “`
然后在RegisterView这个视图类下增加一个用于处理POST请求方式的方法post():
“`python def post(self,request): template_name=’register.html’
form=RegisterForm(request.POST) if form.is_valid():#判断form是否可用
if
form.cleaned_data[‘password’]==form.cleaned_data[‘password_check’]:#检查前后密码是否一致,这个工作可以在页面用JS脚本检查一次,后台再检查一次
try:
b_user,created=BlogUser.objects.update_or_create(username=form.cleaned_data[‘username’],email=form.cleaned_data[‘Email’],password=form.cleaned_data[‘password’],gender=form.cleaned_data[‘gender’])#update_or_create返回的是一个(istance,boolean)形式的tuple,instance是model的实例,如果是创建实例boolean=Ture,如果是更新则为False
return HttpResponse(b_user.username+’用户创建成功’) except Exception as
e: return HttpResponse(‘创建用户失败,出现异常:’+e.messages) else:
HttpResponse(‘前后密码不一致,用户创建失败’) else: return
render(request,template_name,{‘reg_form’:form})
#返回请求的响应,并且渲染模板 “`
然后编辑template文件下的register.html,添加CSRF的防护: “`html

Django项目要操作数据库,首先要和数据库建立连接,才能让程序中的数据和数据库关联起来进行数据的增删改查操作。

{% csrf_token %} {{ reg_form }}

Django项目默认使用mysqldb模块进行和mysql数据库之间的交互操作。下面看下Django进行数据库操作的步骤:

确认注册

88必发唯一官网 1

“` 注意:from的action=”是指post请求提交到当前页面所在的url.
保存后启动服务`python manage.py runserver `
浏览器访问’127.0.0.1:8000/blog/registe’填写信息:
![](https://images2018.cnblogs.com/blog/1300456/201805/1300456-20180526121450205-467949599.png).
提交后:
![](https://images2018.cnblogs.com/blog/1300456/201805/1300456-20180526121550676-1839896039.png).
这时候BlogUser的信息已经写到mysql后台数据库DjangoDB里面了.我们可以去mysql查验一下:
`Ctrl+alt+t`打开另一个终端,`mysql -u root -p`输入密码后进入mysql
shell 在mysql shell下输入 `use
DjangoDB;`进入DjangoDB这个数据库,提示Database changed
说明进入DjangoDB数据库成功.接着输入`select * from
myBlog_bloguser`可以看到用户信息已经保存入myBlog_bloguser这张表里面了:
![](https://images2018.cnblogs.com/blog/1300456/201805/1300456-20180526123523462-1415937269.png).

  1. 修改settings.py 配置数据项

DATABASES = {

‘default’: {

‘ENGINE’: ‘django.db.backends.mysql’,

‘NAME’: ‘mydatabase’,

‘USER’: ‘mydatabaseuser’,

‘PASSWORD’: ‘mypassword’,

‘HOST’: ‘127.0.0.1’,

‘PORT’: ‘3306’,

}

}

配置项参数用法:

ENGINE :
指定数据库驱动,不同的数据库这个字段不同,下面是常见的集中数据库的ENGINE的写法:

django.db.backends.postgresql # PostgreSQL

django.db.backends.mysql # mysql

django.db.backends.sqlite3 # sqlite

django.db.backends.oracle # oracle

NAME: 指定的数据库名,如果是sqlite的话,就需要填数据库文件的绝对位置

USER: 数据库登录的用户名,mysql一般都是root

PASSWORD:登录数据库的密码,必须是USER用户所对应的密码

HOST:
由于一般的数据库都是C/S结构的,所以得指定数据库服务器的位置,我们一般数据库服务器和客户端都是在一台主机上面,所以一般默认都填127.0.0.1

PORT:数据库服务器端口,mysql默认为3306

HOST和PORT都可以不填,使用默认的配置,但是如果你有更改默认配置的话,就需要填入更改后的

  1. 安装数据库驱动

配置完这,下面就需要装python连接mysql数据库的驱动程序,首先,需要安装mysql的开发包,在shell,里面运行:

rpm -qa | grep mysql-devel

如果没有安装,那就安装把:

sudo yum install mysql-devel

#python2.7:

sudo pip install MySQLdb

#python3.4:

sudo pip install PyMySQL

安装好后,启动django

1python manager.py runserver

如果没有出现报错,则表明配置正常,然后在新的shell运行:

python manager.py shell

输入以下命令:

from django.db import connection

cursor = connection.cursor()

如果没有报错,则就表明安装成功,你可以尽情使用django的数据库功能了

  1. 创建一个Django app

一个项目中包含一个或多个这样的app。app可以理解为一块功能集合。比如产品管理模块就包含增删该查等功能,可以把产品管理叫做一个app。每个Django
app都有独立的models,views等,易移植和被复用。

DOS进入项目目录 执行 python manage.py startapp
products生成目录文件如下:

代码如下:

products/

__init__.py

models.py

tests.py

views.py

  1. 编写models

代码如下:

from django.db import models

# Create your models here.

class Company(models.Model):

full_name = models.CharField(max_length=30)

address = models.CharField(max_length=50)

tel = models.CharField(max_length=15,blank=True)

class Product(models.Model):

product_name = models.CharField(max_length=30)

price = models.FloatField()

stock = models.IntegerField(max_length=5)

company = models.ForeignKey(Company)

  1. 模型安装(修改settings.py)

代码如下:

INSTALLED_APPS = (

‘django.contrib.auth’,

‘django.contrib.contenttypes’,

‘django.contrib.sessions’,

‘django.contrib.sites’,

‘django.contrib.messages’,

‘django.contrib.staticfiles’,

‘django.contrib.admin’,

‘django.contrib.admindocs’,

‘DjangoMysqlSite.products’,

)

采用 python manage.py validate 检查模型的语法和逻辑是否正确。

没有错误则执行 python manage.py syncdb创建数据表。

现在你可以看到你的数据库除了生成了products_company,products_product外还创建了其它好几个表,这些是django管理后台所需表暂不管。

6、简单的增删改查

进入python manage.py shell

代码如下:

>>> from DjangoMysqlSite.products.models import Company

>>> c =
Company(full_name=’www.pythontab.com’,address=’beijing’,tel=12345678)

>>> c.save()

>>> company_list = Company.objects.all()

>>> company_list

>>> c = Company.objects.get(full_name=”www.pythontab.com”)

>>> c.tel = 23456789

>>> c.save()

>>> c = Company.objects.get(full_name=”www.pythontab.com”)

>>> c.delete()

#删除所有

>>> Company.objects.all().delete()