Django学习笔记(二)——django数据库的使用
1.模型——SQLite3数据库使用
使用django的数据库必须创建一个app
python manage.py startapp check 创建app
此时manage.py的目录下会多一个check的文件夹,里面有
修改models.py文件
from django.db import models # Create your models here. class usr(models.Model):
usr = models.CharField(max_length=10)
pwd = models.CharField(max_length=10) class access_key(models.Model):
key = models.CharField(max_length=20)
expires_time = models.DateTimeField()
说明:usr为数据表名,usr,pwd为字段
在setting.py文件中部分字段修改为:
INSTALLED_APPS = (
# 'django.contrib.admin',
# 'django.contrib.auth',
# 'django.contrib.contenttypes',
# 'django.contrib.sessions',
# 'django.contrib.messages',
# 'django.contrib.staticfiles', "check",
//在django的教程中,这里写的是mysite.check的,但是不知为什么我一直不行,最后只写check就成功了
) MIDDLEWARE_CLASSES = (
# 'django.contrib.sessions.middleware.SessionMiddleware',
# 'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
# 'django.contrib.auth.middleware.AuthenticationMiddleware',
# 'django.contrib.messages.middleware.MessageMiddleware',
# 'django.middleware.clickjacking.XFrameOptionsMiddleware',
)
cmd中输入 python manage.py valible 检查有没有错
python manage.py sqlall check 生成sql语句
python manage.py syncdb 执行改成生成的语句
如果执行以上语句,django不会自动添加表,可以通过以下代码来输出创建表的sql
from django.db import connection
from django.db.backends import creation
from django.core.management.color import no_style
T=Audit()
c=creation.BaseDatabaseCreation(connection)
print c.sql_create_model(T,no_style())[0][0]
2.数据操作
#插入数据
def dbtestinsert(request):
from check.models import usr
u1=usr(usr='usr1',pwd="pwd1")
u1.save()
return HttpResponse("done") #查找数据
def dbtestselect(request):
from check.models import usr
a=usr.objects.all()
usr=a[0].usr #访问单个列
b=usr.objects.filter(usr='usr1') #过滤,filter相当于sql语句中的where,返回一个列表
c=usr.objects.get(urs='usr1') #get用于获取单个元组,即单行数据
d=usr.objects.order_by("name") #排序
d=usr.objects.order_by("-name") #倒序
e=usr.objects.filter(name__contains="press") #name__contains 相当于sql中的name like “%press%”
f=usr.objects.order_by('name')[0:2]#相当于sql中的 limit 0,3
return HttpResponse(str(a)+str(b))
#更新数据
def dbtestupdate(request):
from check.models import usr
#更新一条记录
b=usr.objects.get(usr='usr1') #过滤,filter相当于sql语句中的where
b.usr='usr2'
b.save()
#更新多条
c=usr.objects.filter(pwd='pwd')
c.update(pwd='pwd1')#update方法会返回影响的记录的条数,执行update后,修改已经commit了 return HttpResponse("done") #删除数据
u1=usr.objects.get(usr='luozixuan')
u1.delete() #输出执行的SQL语句
b=usr.objects.filter(usr='usr1')
print b.query
django默认会把a=usr.objects.all()方法获取的结果缓存起来,如果要获取最新的,需要调用方法
usr.objects.update()
3.模型进阶
3.1访问多对多(sql中的连表查询)
models.py
class usr(models.Model):
usr = models.CharField(max_length=10)
pwd = models.CharField(max_length=10)
def __unicode__(self):
return str({"usr":self.usr,"pwd":self.pwd}) class info(models.Model):
myusr = models.ManyToManyField(usr)
math = models.IntegerField(max_length=10)
chinese = models.IntegerField(max_length=10)
english = models.IntegerField(max_length=10)
def __unicode__(self):
return str({"usr":self.usr,"math":self.math,"chinese":self.chinese,"english":self.english})
现在要实现sql的“select usr.usr,pwd,math,chinese,english from usr,info where usr.usr=info.usr where info.usr='lujianxai'"
i=info.objects.get(usr='lujianxai')
i.myusr.all()
看来模型的连表查询的拓展性比较差,需要连表是,必须连表的一个字段的类型是ManyToManyField,从而连接到另一个表,但是在业务复杂的应用中,设计表时并不知道哪个字段是需要连表查的,所以到后期,业务拓展将十分困难,如果需要三表连表查询,那就更复杂了
3.1添加或删除表的字段,需要先在django的models中修改class的定义,再到数据库客户端通过sql 的 alter table修改
感觉这个也很麻烦。
总结:
好鸡肋的一个功能,django创建自己的数据库管理模块的目的就是统一管理数据库,不用每次运行sql语句时都要连接数据库,方便管理。但是使用数据库连接池PooledDB,就能很方便的管理数据库连接。
而且django这样使用数据库就等于完全舍弃了成熟的,已经成为业界标准的sql语句,而使用自己设计的连接API,这样无疑增加了开发者的开发壁垒,从而增加开发的难度,也使代码的可读性降低了不少。
-----------------
20140418:后来查找了才知道django的这种管理数据库的模式叫ORM模式。
相对于底层的数据库管理模式(connection和cursor),ORM模式对数据库的操作会更方便,需要写的代码会更少,可以快速进行数据的插入,更新,查询,删除等操作。但是ORM指适合操作数据较为简单的业务,对于连表查询,ORM表现得较为吃力。而且对于复杂一点的条件查询(如子查询,sql的exist等),ORM的表现也不尽人意,而且也实现不了sql count(*),sum,max等group功能。
ORM的另一个确定是管理数据库较为麻烦,修改字段要修改model和取数据库客户端用sql语句修改。
Django学习笔记(二)——django数据库的使用的更多相关文章
- Django学习笔记二
Django学习笔记二 模型类,字段,选项,查询,关联,聚合函数,管理器, 一 字段属性和选项 1.1 模型类属性命名限制 1)不能是python的保留关键字. 2)不允许使用连续的下划线,这是由dj ...
- Django学习笔记-修改Django的默认的数据库
1.修改设置settings中的配置 DATABASES = { 'default': { # 'ENGINE': 'django.db.backends.sqlite3', # 'NAME': os ...
- Django学习笔记〇四——数据库ORM的使用(有待修改)
Django框架基本上都是要和数据库结合使用的,我在以前讲过SQLAlchemy框架的使用,Django支持的不是SQLAlchemy,但是也内嵌了ORM框架,可以不需要直接面对数据库编程,而可以通过 ...
- Django学习笔记之Django中间件
准备 我们在前面的课程中已经学会了给视图函数加装饰器来判断是用户是否登录,把没有登录的用户请求跳转到登录页面.我们通过给几个特定视图函数加装饰器实现了这个需求.但是以后添加的视图函数可能也需要加上装饰 ...
- Django学习笔记之Django Form表单
Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...
- Django 学习笔记之五 Django中数据库中ManyToManyField及ForeignKey
1.model里面的代码: from __future__ import unicode_literalsimport django.utils.timezone as timezonefrom dj ...
- django学习笔记二:一个项目多个App项目搭建
django充许在一个项目中存在多个app,如一个大门户网站中可以包含论坛,新闻等内容,其中每一个模块称之为一个App,也可以理解为一个个独立的小型项目最终集成在一个门户网站中最终呈现给用户 本次测试 ...
- Django学习笔记之Django Form表单详解
知识预览 构建一个表单 在Django 中构建一个表单 Django Form 类详解 使用表单模板 回到顶部 构建一个表单 假设你想在你的网站上创建一个简单的表单,以获得用户的名字.你需要类似这样的 ...
- Django学习笔记之Django QuerySet的方法
一般情况下,我们在写Django项目需要操作QuerySet时一些常用的方法已经满足我们日常大多数需求,比如get.filter.exclude.delete神马的感觉就已经无所不能了,但随着项目但业 ...
- Django学习笔记之Django ORM相关操作
一般操作 详细请参考官方文档 必知必会13条 <> all(): 查询所有结果 <> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <> ...
随机推荐
- 我这个IOS渣渣又来写随笔了
我这个渣渣又来写了,哎,今天看了一篇大神面试别人的文章,感觉还有很遥远的路要走,不过没关系,还年轻,才入ios两个月,我相信自己的学习能力,加油! 博客园会是我成长的见证!
- 软中断&tasklet&工作队列
软中断 软中断的分配时静态的(即在编译时定义),而tasklet的分配和初始化能够在执行时进行. 软中断(即便是同一种类型的软中断)能够并发地运行在多个CPU上. 因此,软中断是可重入函数并且必须明白 ...
- Linux内核里的DebugFS
DebugFS,顾名思义,是一种用于内核调试的虚拟文件系统,内核开发者通过debugfs和用户空间交换数据.类似的虚拟文件系统还有procfs和sysfs等,这几种虚拟文件系统都并不实际存储在硬盘上, ...
- 我们应该如何去了解JavaScript引擎的工作原理 系列
http://www.nowamagic.net/librarys/veda/detail/1579
- PureMVC(JS版)源码解析:总结
PureMVC源码中设计到的11个类已经全部解析完了,回首想想,花了一周的时间做的这点事情还是挺值得的,自己的文字组织表达能力和对pureMVC的理解也在写博客的过程中得到了些提升.我也是第一次写系列 ...
- WPF非轮询方式更新数据库变化SqlDependency(数据库修改前台自动更新)
上一章节我们讲到wpf的柱状图组件,它包含了非轮询方式更新数据库变化SqlDependency的内容,但是没有详细解释,现在给大家一个比较简单的例子来说明这部分内容. 上一章节: WPF柱状图(支持数 ...
- Ubuntu 12.04 root默认密码? 如何使用root登录?
在安装Ubuntu 12.04时并没有设置root的密码,登录的时候也没有使用root账户.当我们使用root权限时,一般都使用sudo命令进行.那么当我们安装完毕Ubuntu 12.04时,root ...
- ios开发时候,出现A valid provisioning profile for this executable was not found 错误
今天一大早起来,做ios的开发,发现了一下错误:A valid provisioning profile for this executable was not found 错误的产生是在开发模式下产 ...
- 职场PPT达人装酷的13条秘诀
对<说服力-让你的PPT会说话>读者调查显示,88.8%的白领认为“做出漂亮的幻灯片对晋升有帮助”,99.9%的白领一致认为职场装酷神器排行榜第一位是PPT,甚至有位程序员说哥最牛的编程环 ...
- tcl/tk实例详解——glob使用例解
glob命令 这里以实例的形式解释一下glob命令的用法,很多时候纯粹的语法讲解根本讲不清楚,往往没有一个例子清晰,一下就glob命令进行一些分析,环境为Tclsh85,操作系统为windows XP ...