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数据库的使用的更多相关文章

  1. Django学习笔记二

    Django学习笔记二 模型类,字段,选项,查询,关联,聚合函数,管理器, 一 字段属性和选项 1.1 模型类属性命名限制 1)不能是python的保留关键字. 2)不允许使用连续的下划线,这是由dj ...

  2. Django学习笔记-修改Django的默认的数据库

    1.修改设置settings中的配置 DATABASES = { 'default': { # 'ENGINE': 'django.db.backends.sqlite3', # 'NAME': os ...

  3. Django学习笔记〇四——数据库ORM的使用(有待修改)

    Django框架基本上都是要和数据库结合使用的,我在以前讲过SQLAlchemy框架的使用,Django支持的不是SQLAlchemy,但是也内嵌了ORM框架,可以不需要直接面对数据库编程,而可以通过 ...

  4. Django学习笔记之Django中间件

    准备 我们在前面的课程中已经学会了给视图函数加装饰器来判断是用户是否登录,把没有登录的用户请求跳转到登录页面.我们通过给几个特定视图函数加装饰器实现了这个需求.但是以后添加的视图函数可能也需要加上装饰 ...

  5. Django学习笔记之Django Form表单

    Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...

  6. Django 学习笔记之五 Django中数据库中ManyToManyField及ForeignKey

    1.model里面的代码: from __future__ import unicode_literalsimport django.utils.timezone as timezonefrom dj ...

  7. django学习笔记二:一个项目多个App项目搭建

    django充许在一个项目中存在多个app,如一个大门户网站中可以包含论坛,新闻等内容,其中每一个模块称之为一个App,也可以理解为一个个独立的小型项目最终集成在一个门户网站中最终呈现给用户 本次测试 ...

  8. Django学习笔记之Django Form表单详解

    知识预览 构建一个表单 在Django 中构建一个表单 Django Form 类详解 使用表单模板 回到顶部 构建一个表单 假设你想在你的网站上创建一个简单的表单,以获得用户的名字.你需要类似这样的 ...

  9. Django学习笔记之Django QuerySet的方法

    一般情况下,我们在写Django项目需要操作QuerySet时一些常用的方法已经满足我们日常大多数需求,比如get.filter.exclude.delete神马的感觉就已经无所不能了,但随着项目但业 ...

  10. Django学习笔记之Django ORM相关操作

    一般操作 详细请参考官方文档 必知必会13条 <> all(): 查询所有结果 <> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <> ...

随机推荐

  1. Mysql性能优化之缓存参数优化

    数据库属于 IO 密集型的应用程序,其主要职责就是数据的管理及存储工作.而我们知道,从内存中读取一个数据库的时间是微秒级别,而从一块普通硬盘上读取一个IO是在毫秒级别,二者相差3个数量级.所以,要优化 ...

  2. careercup-树与图 4.2

    4.2 给定有向图,设计一个算法,找出两个结点之间是否存在一条路径. 解答 根据题意,给定一个有向图和起点终点,判断从起点开始,是否存在一条路径可以到达终点. 考查的就是图的遍历,从起点开始遍历该图, ...

  3. MVC - Ajax

    Ajax表单 使用Ajax.BeginForm方法即可开启Ajax表单 Ajax.BeginForm() 参数1:Action名参数2:使用AjaxOptions实例设定异步请求的属性 new Aja ...

  4. Default route and zero route

    A default route of a computer that is participating in computer networking is the packet forwarding ...

  5. Java SSL/TLS Socket实现

    通信端无需向对方证明自己的身份,则称该端处于"客户模式",否则称其处于"服务器模式",无论是客户端还是服务器端,都可处于"客户模式"或者&q ...

  6. SharePoint 页面Pages和SitePages目录创建不成功解决

    最近项目中要用到Pages及SitePages目录中的一个 可是目录时,不是发现没有Pages就是没SitePages: 分析后才得知Pages目录需要开户SharePoint Server Publ ...

  7. (转)C#中的Dictionary字典类介绍

    关键字:C# Dictionary 字典 作者:txw1958原文:http://www.cnblogs.com/txw1958/archive/2012/11/07/csharp-dictionar ...

  8. ArcGIS Runtime SDK for WPF已不更新,后续将被ArcGIS Runtime SDK for .NET取代

    ArcGIS Runtime SDK 10.2.5 for WPF is now available! by mbranscomb and Rex Hansen on January 27, 2015 ...

  9. cognos 10.2.2 report studio数字---字符型查询注意事项

    做了一个简单的报表,就是按照员工编号查询员工,其中员工编号是全数字,我们保存在数据库中的是字符型varchar2(10),所以在report studio中做查询就一直报告服务器错误. 其中使用cas ...

  10. sql的临时表使用小结

    1.创建方法: 方法一:create table TempTableName或select [字段1,字段2,...,] into TempTableName from table 方法二:creat ...