Django项目中使用mysql

DATABASES = {

    'default': {

        'ENGINE': 'django.db.backends.mysql', 

        'NAME': 'books',    #你的数据库名称

        'USER': 'root',   #你的数据库用户名

        'PASSWORD': '', #你的数据库密码

        'HOST': '', #你的数据库主机,留空默认为localhost

        'PORT': '', #你的数据库端口

    }

}

注意:

NAME即数据库的名字,在mysql连接前该数据库必须已经创建,而上面的sqlite数据库下的db.sqlite3则是项目自动创建

USER和PASSWORD分别是数据库的用户名和密码。

设置完后,再启动我们的Django项目前,我们需要激活我们的mysql。

然后,启动项目,会报错:no module named MySQLdb

这是因为django默认你导入的驱动是MySQLdb,可是MySQLdb对于py3有很大问题,所以我们需要的驱动是PyMySQL

所以,我们只需要找到项目名文件下的__init__,在里面写入:

import pymysql
pymysql.install_as_MySQLdb() 问题解决!

ORM:object relation mapping  对象关系映射,其实就是通过pyhon中的对象(由类实例化而来)和数据库中的表做一个映射。表中的一条记录其实就是一个实例对象。类就相当于是一个表头,在类中设置表头中的内容和字段类型。

所写的类必须要继承models.Model这个类,不然Python不知道你这个类是用于操作数据库的。

class book(models.Model):
name=models.CharField(max_length=20) #注意models后面跟的都是方法
price=models.IntegerField()
pub_date=models.DateField()

已创建了表,然后追加一列:

class book(models.Model):
name=models.CharField(max_length=20)
price=models.IntegerField()
pub_date=models.DateField() 之前创建了一张表,再给表增加下面一列内容: author=models.CharField(max_length=32,null=False) 由于这是个追加的列,表里面可能已经存在数据,对于这些数据要怎么处理?所以当执行pyhon manage.py makemigrations的时候会有以下提示并让你选择:
You are trying to add a non-nullable field 'author' to book without a default; we can't do that (the database needs something to populate existing ro
ws).
Please select a fix:
1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
2) Quit, and let me add a default in models.py
Select an option: #选择1表未输入一个默认值,选择2表示退出,在models.py文件中的对应类中自己手动加入default="xx"的参数。

单表操作

表记录的添加:

方式一:

    b=book(name="python",price=99,author="yuan",pub_date="2017-12-12")
b.save() #只有save了,这条数据才加进数据库

方式二:

book.objects.create(name="linux",price=78,author="oldboy",pub_date="2016-12-12")    #不用保存
   book.objects.create(**{"name"="linux","price"=78}) #如果从前端传过来的是字典,就可以直接这样使用

表记录的修改:

  方式一:(建议使用这种方法) 

    book.objects.filter(author="yuan").update(price=999)  #update是QuerySet的方法

  方式二:由于这种方式,除了修改的字段,其它的也会重新赋值,效率比较低,所以不建议用

    b=book.objects.get(author="oldboy")  #get只能拿一条记录,拿0个或多个都会报错
b.price=120
b.save()

表记录的删除 :

  book.objects.filter(author="oldboy").delete()  #delete也是QuerySet象的方法

表记录的查询:    book_list = book.objects.filter(id=2)

    book_list = book.objects.filter(id=2)    
   print(book_list) #<QuerySet [<book: book object (2)>]>
print(type(book_list)) #<class 'django.db.models.query.QuerySet'> ret = book.objects.exclude(author="yuan")
print(ret) #<QuerySet [<book: book object (2)>]>
print(type(ret)) #<class 'django.db.models.query.QuerySet'> book_list=book.objects.all() #拿到的是QuerySet集合
print(book_list)
  #<QuerySet [<book: book object (1)>, <book: book object (2)>]>
  #如果在表里面定义了__str__方法,则返回的是<QuerySet [<book: python基础>, <book: linux运维>]>
print(type(book_list)) #<class 'django.db.models.query.QuerySet'> print(book_list[0]) #book object (1) 如果在表里面定义了__str__方法,则返回的是 python基础
print(type(book_list[0])) #<class 'app01.models.book'>
book_list = book.objects.all()[:3]
book_list = book.objects.all()[::2]
book_list = book.objects.all()[::-1] #可以对这个集合进行切片 ------------------------------------------------------------------------------------------------ #下面方法拿到的是一个实例对象
book_list = book.objects.get(id=2)
print(book_list) #book object (2) 如果在表里面定义了__str__方法,则返回的是linux运维
print(type(book_list)) #<class 'app01.models.book'> book_list = book.objects.first()
print(book_list) #book object (1) 如果在表里面定义了__str__方法,则返回的是 python基础
print(type(book_list)) #<class 'app01.models.book'>
book_list = book.objects.last() ------------------------------------------------------------------------------------------------ ret = book.objects.filter(author="yuan").values("name","price")
print(ret) #<QuerySet [{'price': 99, 'name': 'python基础'}]>
print(type(ret)) #<class 'django.db.models.query.QuerySet'> ret = book.objects.filter(author="yuan").values_list("name","price")
print(ret) #<QuerySet [('python基础', 99)]>
print(type(ret)) #<class 'django.db.models.query.QuerySet'>   注意:(1)values得到的是字典,而values_list得到的是元组。
     (2)虽然values获得结果的类型和filter,all等是一样的,但在显示内容上有所不同
     (3)QuerySet的形式是一个大的列表

book_list=book.objects.all().values("name").distinct()
book_count=book.objects.all().values("name").distinct().count()
print(book_count)

模糊查找:了不起的双下划线__

双下划线其实是字段名的一种功能,如果是普通字段,则运用方法对字段进行过滤,如果是外键,双下划线可以链接到另一张表查询。

    book_list=book.objects.filter(id__lt=10, id__gt=1).values("name","price")
book_list = book.objects.exclude(id__in=[11, 22, 33])
book_list = book.objects.filter(id__range=[1, 2])
book_list=book.objects.filter(name__icontains="p").values_list("name","price") #不区分大小写
book_list=book.objects.filter(name__contains="p").values_list("name","price") #区分大小写 #startswith,istartswith, endswith, iendswith,

Python:Day54 ORM的更多相关文章

  1. Python:轻量级 ORM 框架 peewee 用法详解(二)——增删改查

    说明:peewee 中有很多方法是延时执行的,需要调用 execute() 方法使其执行.下文中不再特意说明这个问题,大家看代码. 本文中代码样例所使用的 Person 模型如下: class Per ...

  2. Python:Day55 ORM多表操作

    命令行创建UTF8数据库: CREATE DATABASE 数据库名称 DEFAULT CHARSET utf8 COLLATE utf8_general_ci; 创建多表(外键)

  3. python下的orm基本操作(1)--Mysql下的CRUD简单操作(含源码DEMO)

    最近逐渐打算将工作的环境转移到ubuntu下,突然发现对于我来说,这ubuntu对于我这种上上网,收收邮件,写写博客,写写程序的时实在是太合适了,除了刚接触的时候会不怎么完全适应命令行及各种权限管理, ...

  4. python 之路,Day11(上) - python mysql and ORM

    python 之路,Day11 - python mysql and ORM   本节内容 数据库介绍 mysql 数据库安装使用 mysql管理 mysql 数据类型 常用mysql命令 创建数据库 ...

  5. Python:渗透测试开源项目

    Python:渗透测试开源项目[源码值得精读] sql注入工具:sqlmap DNS安全监测:DNSRecon 暴力破解测试工具:patator XSS漏洞利用工具:XSSer Web服务器压力测试工 ...

  6. Flask学习笔记:数据库ORM操作MySQL+pymysql/mysql-python+SQLAlchemy/Flask-SQLAlchemy

    Python中使用sqlalchemy插件可以实现ORM(Object Relationship Mapping,模型关系映射)框架,而Flask中的flask-sqlalchemy其实就是在sqla ...

  7. Python:使用threading模块实现多线程编程

    转:http://blog.csdn.net/bravezhe/article/details/8585437 Python:使用threading模块实现多线程编程一[综述] Python这门解释性 ...

  8. Python:开发Sublime插件,方便PHP开发

    Python:开发Sublime插件,方便PHP开发 背景 最近在学习PHP,开发环境选择了Sublime2,开发过程发现执行PHP程序非常不方便,需要自己在浏览器中输入路径以进行调试,这点不如Dre ...

  9. Python:高级主题之(属性取值和赋值过程、属性描述符、装饰器)

    Python:高级主题之(属性取值和赋值过程.属性描述符.装饰器) 背景 学习了Javascript才知道原来属性的取值和赋值操作访问的“位置”可能不同.还有词法作用域这个东西,这也是我学习任何一门语 ...

随机推荐

  1. javascript浅拷贝深拷贝详解

    一.浅拷贝 浅拷贝在现实中最常见的表现在赋值上面,例如 <!DOCTYPE html> <html lang="en"> <head> < ...

  2. 4 ;XHTML表格

    1.表格的基本格式 2.<table>标签下的常用属性 3.<table>标签下的边框设置 4.<tr><th><td>标签下的常用属性 5 ...

  3. 前端入门6-JavaScript客户端api&jQuery

    本篇文章已授权微信公众号 dasu_Android(大苏)独家发布 声明 本系列文章内容全部梳理自以下四个来源: <HTML5权威指南> <JavaScript权威指南> MD ...

  4. BZOJ 1188: [HNOI2007]分裂游戏(multi-nim)

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1386  Solved: 840[Submit][Status][Discuss] Descripti ...

  5. router-view在vue2.0中不显示,解决方法

    学习的router-view路由一直不显示,我翻看vue文档,花费1个小事终于找到原因,希望我的问题能给初学的同学,带来福音,版本不一样,真的烦 在此总结记录,以免以后在此遇到此问题 //配置路由 c ...

  6. GeoServer中使用样式化图层描述符(sld)给WMS加注记

    现有一个shp格式的道路注记文件,用点来表示注记的位置,属性表中保存每个点对应的字,在QGIS中打开如下图所示 它的属性表如下 现需要把道路数据和它的注记发布为WMS服务,通过GeoServer直接发 ...

  7. 如何查看程序所占端口号和IP

    如何查看程序所占端口号和IP 一个软件可能占用多个端口拥有多个目标IP,下面以FQ工具Lantern为例,说明端口查看方法: 1.借助第三方软件查看 如果你电脑上安装了360等优化工具,可能会自带查看 ...

  8. android网页打印,安卓网页打印,h5页面打印,浏览器打印,js打印工具

    Android设备打印比较麻烦,一般设备厂商都提供原生app开发的SDK,我们web开发者为难了,不会原生开发啊 给大家提供一个思路,实现web加壳,利用打印浏览器实现 简单来说就是把我们的web页面 ...

  9. 关于iframe跨域实践

    提要 项目中与到iframe子页面中需要通过top获取在父页面中的全局变量的需求,由于App部署的缘故,导致父页面和iframe子页面分别在不同的端口下,导致iframe跨域现象,通过查阅资料进行问题 ...

  10. Linux 最小化安装后IP的配置(手动获取静态IP地址)

    一.图形化界面配置(假设为电脑A) 如果你的Linux安装有图形化界面,那么通过以下方式来配置: 我这里是有两块网卡,第一个网卡在上篇中已经通过DHCP来配置了:Linux 最小化安装后IP的配置(D ...