导读:本篇文章首席CTO笔记来给大家介绍有关django如何查询多个表的数据库的相关内容,希望对大家有所帮助,一起来看看吧。
如何在django中使用多个数据库
在配置里将数据库路径放进去。然后在module里,自己选择相应的库与相应的model做关联。
此外还可以指定表格中的字段名。另外如果上面的方法不好用,你也可以自己直接连接数据库,自己管理。
django的数据库连接是没有连接池的。 每次访问都连接一次,效率低。不过你也可以用同样的原理 ,用mysqldb之类的库,自己建立数据库连接。
Django的多数据库问题,怎么解决
选择开始菜单中→程序→【Management SQL Server 2008】→【SQL Server Management Studio】命令,打开【SQL Server Management Studio】窗口,并使用Windows或 SQL Server身份验证建立连接。
在【对象资源管理器】窗口中展开服务器,然后选择【数据库】节点
右键单击【数据库】节点,从弹出来的快捷菜单中选择【新建数据库】命令。
执行上述操作后,会弹出【新建数据库】对话框。在对话框、左侧有3个选项,分别是【常规】、【选项】和【文件组】。完成这三个选项中的设置会后,就完成了数据库的创建工作,
在【数据库名称】文本框中输入要新建数据库的名称。例如,这里以“新建的数据库”。
在【所有者】文本框中输入新建数据库的所有者,如sa。根据数据库的使用情况,选择启用或者禁用【使用全文索引】复选框。
在【数据库文件】列表中包括两行,一行是数据库文件,而另一行是日记文件。通过单击下面的【添加】、【删除】按钮添加或删除数据库文件。
切换到【选项页】、在这里可以设置数据库的排序规则、恢复模式、兼容级别和其他属性。
切换到【文件组】页,在这里可以添加或删除文件组。
完成以上操作后,单击【确定】按钮关闭【新建数据库】对话框。至此“新建的数据”数据库创建成功。新建的数据库可以再【对象资源管理器】窗口看到。
Django如何多表联合统计查询
如果你觉着使用自带ORM查询费劲的话。直接获取数据库连接,然后执行sql语句。
def my_custom_sql(): from django.db import connection, transaction cursor = connection.cursor() # 数据修改操作——提交要求 cursor.execute("UPDATE bar SET foo = 1 WHERE baz = %s", [self.baz]) transaction.commit_unless_managed() # 数据检索操作,不需要提交 cursor.execute("SELECT foo FROM bar WHERE baz = %s", [self.baz]) row = cursor.fetchone() return row
多数据
from django.db import connectionscursor = connections['my_db_alias'].cursor()# Your code here...transaction.commit_unless_managed(using='my_db_alias')
通常我们不需要手动调用
transaction.commit_unless_managed(
),我们可以这样做:
@commit_on_successdef my_custom_sql_view(request, value): from django.db import connection, transaction cursor = connection.cursor() # Data modifying operation cursor.execute("UPDATE bar SET foo = 1 WHERE baz = %s", [value]) # Since we modified data, mark the transaction as dirty transaction.set_dirty() # Data retrieval operation. This doesn't dirty the transaction, # so no call to set_dirty() is required. cursor.execute("SELECT foo FROM bar WHERE baz = %s", [value]) row = cursor.fetchone() return render_to_response('template.html', {'row': row})
python + django 多表联合查询方法求教
先让我们回忆一下在第五章里的关于书本(book)的数据模型:
1
from django.db import models
class Publisher(models.Model):
name = models.CharField(max_length=30)
address = models.CharField(max_length=50)
city = models.CharField(max_length=60)
state_province = models.CharField(max_length=30)
country = models.CharField(max_length=50)
website = models.URLField()
def __unicode__(self):
return self.name
class Author(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=40)
email = models.EmailField()
def __unicode__(self):
return u'%s %s' % (self.first_name, self.last_name)
class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)
publication_date = models.DateField()
def __unicode__(self):
return self.title
如我们在第5章的讲解,获取数据库对象的特定字段的值只需直接使用属性。 例如,要确定ID为50的书本的标题,我们这样做:
from mysite.books.models import Book
b = Book.objects.get(id=50)
b.title
u'The Django Book'
但是,在之前有一件我们没提及到的是表现为ForeignKey 或 ManyToManyField的关联对象字段,它们的作用稍有不同。
访问外键(Foreign Key)值
当你获取一个ForeignKey 字段时,你会得到相关的数据模型对象。 例如:
b = Book.objects.get(id=50)
b.publisher
Publisher: Apress Publishing
b.publisher.website
u''
对于用`` ForeignKey``
来定义的关系来说,在关系的另一端也能反向的追溯回来,只不过由于不对称性的关系而稍有不同。 通过一个`` publisher`` 对象,直接获取
books ,用 publisher.book_set.all() ,如下:
p = Publisher.objects.get(name='Apress Publishing')
p.book_set.all()
[Book: The Django Book, Book: Dive Into Python, ...]
实际上,book_set 只是一个 QuerySet(参考第5章的介绍),所以它可以像QuerySet一样,能实现数据过滤和分切,例如:
1
p = Publisher.objects.get(name='Apress Publishing')
p.book_set.filter(name__icontains='django')
[Book: The Django Book, Book: Pro Django]
属性名称book_set是由模型名称的小写(如book)加_set组成的。
访问多对多值(Many-to-Many Values)
多对多和外键工作方式相同,只不过我们处理的是QuerySet而不是模型实例。 例如,这里是如何查看书籍的作者:
b = Book.objects.get(id=50)
b.authors.all()
[Author: Adrian Holovaty, Author: Jacob Kaplan-Moss]
b.authors.filter(first_name='Adrian')
[Author: Adrian Holovaty]
b.authors.filter(first_name='Adam')
[]
反向查询也可以。 要查看一个作者的所有书籍,使用author.book_set ,就如这样:
a = Author.objects.get(first_name='Adrian', last_name='Holovaty')
a.book_set.all()
[Book: The Django Book, Book: Adrian's Other Book]
这里,就像使用 ForeignKey字段一样,属性名book_set是在数据模型(model)名后追加_set。
更改数据库模式(Database Schema)
3
在我们在第5章介绍 syncdb 这个命令时, 我们注意到 syncdb仅仅创建数据库里还没有的表,它 并不 对你数据模型的修改进行同步,也不处理数据模型的删除。 如果你新增或修改数据模型里的字段,或是删除了一个数据模型,你需要手动在数据库里进行相应的修改。 这段将解释了具体怎么做:
当处理模型修改的时候,将Django的数据库层的工作流程铭记于心是很重要的。
如果模型包含一个未曾在数据库里建立的字段,Django会报出错信息。 当你第一次用Django的数据库API请求表中不存在的字段时会导致错误(就是说,它会在运行时出错,而不是编译时)。
3
Django不关心数据库表中是否存在未在模型中定义的列。
Django不关心数据库中是否存在未被模型表示的表格。
1
改变模型的模式架构意味着需要按照顺序更改Python代码和数据库。
添加字段
1
当要向一个产品设置表(或者说是model)添加一个字段的时候,要使用的技巧是利用Django不关心表里是否包含model里所没有的列的特性。 策略就是现在数据库里加入字段,然后同步Django的模型以包含新字段。
3
然而 这里有一个鸡生蛋蛋生鸡的问题 ,由于要想了解新增列的SQL语句,你需要使用Django的
manage.py sqlall命令进行查看 ,而这又需要字段已经在模型里存在了。 (注意:你并 不是非得使用与Django相同的SQL语句创建新的字段,但是这样做确实是一个好主意 ,它能让一切都保持同步。)
3
这个鸡-蛋的问题的解决方法是在开发者环境里而不是发布环境里实现这个变化。 (你正使用的是测试/开发环境,对吧?)下面是具体的实施步骤。
首先,进入开发环境(也就是说,不是在发布环境里):
在你的模型里添加字段。
运行 manage.py sqlall [yourapp] 来测试模型新的 CREATE TABLE 语句。 注意为新字段的列定义。
开启你的数据库的交互命令界面(比如, psql 或mysql , 或者可以使用
manage.py dbshell )。 执行 ALTER TABLE 语句来添加新列。
使用Python的manage.py shell,通过导入模型和选中表单(例如,
MyModel.objects.all()[:5] )来验证新的字段是否被正确的添加 ,如果一切顺利,所有的语句都不会报错。
3
然后在你的产品服务器上再实施一遍这些步骤。
启动数据库的交互界面。
5
执行在开发环境步骤中,第三步的ALTER TABLE语句。
将新的字段加入到模型中。 如果你使用了某种版本控制工具,并且在第一步中,已经提交了你在开发环境上的修改,现在,可以在生产环境中更新你的代码了(例如,如果你使用Subversion,执行svn update。
重新启动Web server,使修改生效。
让我们实践下,比如添加一个num_pages字段到第五章中Book模型。首先,我们会把开发环境中的模型改成如下形式:
class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)
publication_date = models.DateField()
**num_pages = models.IntegerField(blank=True, null=True)**
def __unicode__(self):
return self.title
Django表关联对象及多表查询
首先建立Student,Dpartment,Course,Stu_info表
一对多表关系数据的添加:
1.第一种方式就是跟之前的一样,用传参的方法添加,需要注意的是外键的值必须是关联表中已经存在的值.
2.第二种方式是用的属性赋值的方式,因为我们在模型类有定义了一个department的属性,而这个属性的对象的类型必须是department表的类实例对象
表关联对象的访问:
Student的模型类中我们有定义department的属性,所以当我们去访问的时候,可以直接通过student.department的形式去找到某个学生的所属学院是哪个.
那么如果我们也希望在在访问某个学院的实现对象的学生的时候改怎么访问呢???
表关联对象的访问:
可以在定义时设置related_name 参数来覆盖foo_set 的名称.
clear() 从关联的对象集中删除所有的对象
多表查询----跨关联关系的查询:
Django 提供一种强大而又直观的方式来“处理”查询中的关联关系,它在后台自动帮你处理JOIN。 若要跨越关联关系,只需使用关联的模型字段的名称,并使用双下划线分隔,直至你想要的字段:
它还可以反向工作。若要引用一个“反向”的关系,只需要使用该模型的小写的名称。
结语:以上就是首席CTO笔记为大家整理的关于django如何查询多个表的数据库的相关内容解答汇总了,希望对您有所帮助!如果解决了您的问题欢迎分享给更多关注此问题的朋友喔~