`
chqich73
  • 浏览: 5515 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
社区版块
存档分类
最新评论

python数据库操作

阅读更多
class Blog(models.Model):    
     name = models.CharField(max_length=100)    
     tagline = models.TextField()    
   
    def __unicode__(self):    
        return self.name    
   
class Author(models.Model):    
     name = models.CharField(max_length=50)    
     email = models.EmailField()    
   
    def __unicode__(self):    
        return self.name    
   
class Entry(models.Model):    
     blog = models.ForeignKey(Blog)    
     headline = models.CharField(max_length=255)    
     body_text = models.TextField()    
     pub_date = models.DateTimeField()    
     authors = models.ManyToManyField(Author)    
   
    def __unicode__(self):    
        return self.headline  



这是model,有blog,author,以及entry;其中entry分别与blog与author表关联,entry与blog表是通过外键(models.ForeignKey())相连,属于一对多的关系,即一个entry对应多个blog,entry与author是多对多的关系,通过modles.ManyToManyField()实现。
一、插入数据库,用save()方法实现,如下:
>>> from mysite.blog.models import Blog 
>>> b = Blog(name='Beatles Blog', tagline='All the latest Beatles news.') 
>>> b.save() 


二、更新数据库,也用save()方法实现,如下:
>> b5.name = 'New name' 
>> b5.save() 



保存外键和多对多关系的字段,如下例子:
更新外键字段和普通的字段一样,只要指定一个对象的正确类型。
>>>
 cheese_blog = Blog.objects.get(name="Cheddar Talk") 
>>> entry.blog = cheese_blog 
>>> entry.save() 


更新多对多字段时又一点不太一样,使用add()方法添加相关联的字段的值。
>> joe = Author.objects.create(name="Joe") 
>> entry.authors.add(joe)


三、检索对象

>>> Blog.objects 
<django.db.models.manager.Manager object at ...> 
>>> b = Blog(name='Foo', tagline='Bar') 
>>> b.objects 
Traceback: 
    ... 
AttributeError: "Manager isn't accessible via Blog instances." 
1、检索所有的对象

>>>
all_entries = Entry.objects.all() 


使用all()方法返回数据库中的所有对象。

2、检索特定的对象
使用以下两个方法:
fileter(**kwargs)
返回一个与参数匹配的QuerySet,相当于等于(=).
exclude(**kwargs)
返回一个与参数不匹配的QuerySet,相当于不等于(!=)。

Entry.objects.filter(pub_date__year=2006)
不使用Entry.objects.all().filter(pub_date__year=2006),虽然也能运行,all()最好再获取所有的对象时使用。
上面的例子等同于的sql语句:
slect * from entry where pub_date_year='2006'

链接过滤器:
>>> Entry.objects.filter( 
...     headline__startswith='What' 
... ).exclude( 
...     pub_date__gte=datetime.now() 
... ).filter( 
...     pub_date__gte=datetime(2005, 1, 1) 
... ) 

最后返回的QuerySet是headline like 'What%' and put_date<now() and pub_date>2005-01-01

另外一种方法:
>> q1 = Entry.objects.filter(headline__startswith="What")
>> q2 = q1.exclude(pub_date__gte=datetime.now())
>> q3 = q1.filter(pub_date__gte=datetime.now())
这种方法的好处是可以对q1进行重用。

QuerySet是延迟加载
只在使用的时候才会去访问数据库,如下:
>>> q = Entry.objects.filter(headline__startswith="What") 
>>> q = q.filter(pub_date__lte=datetime.now()) 
>>> q = q.exclude(body_text__icontains="food") 
>>> print q 
在print q时才会访问数据库。

其他的QuerySet方法
>>> Entry.objects.all()[:5]
这是查找前5个entry表里的数据

>>> Entry.objects.all()[5:10]
这是查找从第5个到第10个之间的数据。

>>> Entry.objects.all()[:10:2]
这是查询从第0个开始到第10个,步长为2的数据。

>>> Entry.objects.order_by('headline')[0]
这是取按headline字段排序后的第一个对象。

>>> Entry.objects.order_by('headline')[0:1].get()
这和上面的等同的。

>>> Entry.objects.filter(pub_date__lte='2006-01-01')
等同于SELECT * FROM blog_entry WHERE pub_date <= '2006-01-01';

>>> Entry.objects.get(headline__exact="Man bites dog")
等同于SELECT ... WHERE headline = 'Man bites dog';

>>> Blog.objects.get(id__exact=14) # Explicit form
>>> Blog.objects.get(id=14)         # __exact is implied
这两种方式是等同的,都是查找id=14的对象。

>>> Blog.objects.get(name__iexact="beatles blog")
查找name="beatles blog"的对象,不去饭大小写。

Entry.objects.get(headline__contains='Lennon')
等同于SELECT ... WHERE headline LIKE '%Lennon%';

startswith 等同于sql语句中的 name like 'Lennon%',
endswith等同于sql语句中的 name like '%Lennon'.

>>> Entry.objects.filter(blog__name__exact='Beatles Blog')
查找entry表中外键关系blog_name='Beatles Blog'的Entry对象。

>>> Blog.objects.filter(entry__headline__contains='Lennon')
查找blog表中外键关系entry表中的headline字段中包含Lennon的blog数据。

Blog.objects.filter(entry__author__name='Lennon')
查找blog表中外键关系entry表中的author字段中包含Lennon的blog数据。

Blog.objects.filter(entry__author__name__isnull=True)
Blog.objects.filter(entry__author__isnull=False,entry__author__name__isnull=True)
查询的是author_name为null的值

Blog.objects.filter(entry__headline__contains='Lennon',entry__pub_date__year=2008)
Blog.objects.filter(entry__headline__contains='Lennon').filter( entry__pub_date__year=2008)
这两种查询在某些情况下是相同的,某些情况下是不同的。第一种是限制所有的blog数据的,而第二种情况则是第一个filter是
限制blog的,而第二个filter则是限制entry的

>>> Blog.objects.get(id__exact=14) # Explicit form
>>> Blog.objects.get(id=14) # __exact is implied
>>> Blog.objects.get(pk=14) # pk implies id__exact
等同于select * from where id=14


# Get blogs entries with id 1, 4 and 7
>>> Blog.objects.filter(pk__in=[1,4,7])
等同于select * from where id in{1,4,7}
# Get all blog entries with id > 14
>>> Blog.objects.filter(pk__gt=14)
等同于select * from id>14

>>> Entry.objects.filter(blog__id__exact=3) # Explicit form
>>> Entry.objects.filter(blog__id=3)        # __exact is implied
>>> Entry.objects.filter(blog__pk=3)        # __pk implies __id__exact
这三种情况是相同的


>>> Entry.objects.filter(headline__contains='%')
等同于SELECT ... WHERE headline LIKE '%\%%';


Caching and QuerySets

>>> print [e.headline for e in Entry.objects.all()]
>>> print [e.pub_date for e in Entry.objects.all()]
应改写为:
>> queryset = Poll.objects.all()
>>> print [p.headline for p in queryset] # Evaluate the query set.
>>> print [p.pub_date for p in queryset] # Re-use the cache from the evaluation.、
这样利用缓存,减少访问数据库的次数。

四、用Q对象实现复杂的查询

Q(question__startswith='Who') | Q(question__startswith='What')
等同于WHERE question LIKE 'Who%' OR question LIKE 'What%'


Poll.objects.get(
    Q(question__startswith='Who'),
    Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))
)
等同于SELECT * from polls WHERE question LIKE 'Who%' AND (pub_date = '2005-05-02' OR pub_date = '2005-05-06')

Poll.objects.get(
    Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)),
    question__startswith='Who')
等同于Poll.objects.get(question__startswith='Who', Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)))


五、比较对象

>>> some_entry == other_entry
>>> some_entry.id == other_entry.id


六、删除

Entry.objects.filter(pub_date__year=2005).delete()


b = Blog.objects.get(pk=1)
# This will delete the Blog and all of its Entry objects.
b.delete()

Entry.objects.all().delete()
删除所有

七、一次更新多个值

# Update all the headlines with pub_date in 2007.
Entry.objects.filter(pub_date__year=2007).update(headline='Everything is the same')

>>> b = Blog.objects.get(pk=1)
# Change every Entry so that it belongs to this Blog.
>>> Entry.objects.all().update(blog=b)

如果用save()方法,必须一个一个进行保存,需要对其就行遍历,如下:
for item in my_queryset:
    item.save()

关联对象

one-to-many
>>> e = Entry.objects.get(id=2)
>>> e.blog # Returns the related Blog object.


>>> e = Entry.objects.get(id=2)
>>> e.blog = some_blog
>>> e.save()

>>> e = Entry.objects.get(id=2)
>>> e.blog = None
>>> e.save() # "UPDATE blog_entry SET blog_id = NULL ...;"

>>> e = Entry.objects.get(id=2)
>>> print e.blog # Hits the database to retrieve the associated Blog.
>>> print e.blog # Doesn't hit the database; uses cached version.

>>> e = Entry.objects.select_related().get(id=2)
>>> print e.blog # Doesn't hit the database; uses cached version.
>>> print e.blog # Doesn't hit the database; uses cached version

>>> b = Blog.objects.get(id=1)
>>> b.entry_set.all() # Returns all Entry objects related to Blog.

# b.entry_set is a Manager that returns QuerySets.
>>> b.entry_set.filter(headline__contains='Lennon')
>>> b.entry_set.count()


>>> b = Blog.objects.get(id=1)
>>> b.entries.all() # Returns all Entry objects related to Blog.
# b.entries is a Manager that returns QuerySets.
>>> b.entries.filter(headline__contains='Lennon')
>>> b.entries.count()

You cannot access a reverse ForeignKey Manager from the class; it must be accessed from an instance:
>>> Blog.entry_set

add(obj1, obj2, ...)
    Adds the specified model objects to the related object set.
create(**kwargs)
    Creates a new object, saves it and puts it in the related object set. Returns the newly created object.
remove(obj1, obj2, ...)
    Removes the specified model objects from the related object set.
clear()
    Removes all objects from the related object set.
   
many-to-many类型:
e = Entry.objects.get(id=3)
e.authors.all() # Returns all Author objects for this Entry.
e.authors.count()
e.authors.filter(name__contains='John')
a = Author.objects.get(id=5)
a.entry_set.all() # Returns all Entry objects for this Author.

one-to-one 类型:
class EntryDetail(models.Model):
    entry = models.OneToOneField(Entry)
    details = models.TextField()

ed = EntryDetail.objects.get(id=2)
ed.entry # Returns the related Entry object


使用sql语句进行查询:

def my_custom_sql(self):
    from django.db import connection
    cursor = connection.cursor()
    cursor.execute("SELECT foo FROM bar WHERE baz = %s", [self.baz])
    row = cursor.fetchone()
    return row
分享到:
评论

相关推荐

    Python数据库操作函数

    Python数据库操作函数,直接将数据库操作封装为函数,可直接调用。

    Python数据库操作库研究.zip

    本资料"Python数据库操作库研究.zip"可能包含了一篇详细探讨这些库的PDF文档,让我们深入了解一下其中可能涉及的关键知识点。 1. **SQLite**:SQLite是一个轻量级的嵌入式数据库,无需单独服务器进程,可以直接在...

    Python数据库操作:SQLAlchemy教程

    ### Python数据库操作:SQLAlchemy教程 #### 一、Python环境搭建与SQLAlchemy安装 ##### 1.1 Python环境搭建 **原理与内容:** - **Python简介:**Python是一种广泛使用的高级编程语言,以其简洁和易读性著称。...

    Python数据库操作库研究.pdf

    Python数据库操作库研究.pdf

    SQLAlchemy库:Python数据库操作的全方位指南

    SQLAlchemy库以其强大的功能和灵活性,成为了Python数据库操作的首选工具。通过本文的介绍,你应该对SQLAlchemy有了基本的了解,并学会了如何在Python中使用SQLAlchemy进行数据库操作。无论是简单的数据存储还是复杂...

    10-Python数据库操作

    Python数据库操作思维导图,便捷整理思路,库、库的导入、创建连接、创建游标、执行SQL语句、关闭连接

    课堂笔记:面试测试必会之jmeter+postman+python数据库操作技巧!.xmind

    课堂笔记:面试测试必会之jmeter+postman+python数据库操作技巧!

    Python操作数据库(课件)

    【Python操作数据库】 ...这个课件非常适合初学者和教师,通过一个综合案例详细展示了Python操作SQLite数据库的全过程,涵盖从数据库基础、SQL语句到Python API的使用,是学习和复习Python数据库操作的宝贵资源。

    python操作mysql数据库.pdf

    Python 操作 MySQL 数据库 Python 操作 MySQL 数据库是通过 Python DB-API 实现的,Python DB-API 为开发人员提供了数据库应用编程接口。Python 数据库接口支持非常多的数据库,可以选择适合项目的数据库,如 ...

    用于做python数据库实验的营养数据源

    标题中的“用于做python数据库实验的营养数据源”指出,这是一个专门为Python数据库操作设计的数据集,主要用于教学和实验目的。在Python编程中,数据库交互是一个重要的部分,它涉及到如何存储、检索和处理数据。...

    python数据库课程.7z

    通过学习这个压缩包中的所有文件,你可以获得全面的Python数据库操作经验,包括NoSQL(MongoDB、Redis)和SQL(MySQL)数据库的使用,以及并发处理、日志记录、JSON数据处理和高级编程技巧(如装饰器)。这些知识...

    数据库实战资源:Python数据库实战(第2版)源代码

    《Python数据库实战(第2版)》...通过学习《Python数据库实战(第2版)》的源代码,你可以掌握SQLAlchemy的使用技巧,进一步提升Python数据库操作的能力,无论是在开发复杂业务应用还是进行数据处理时,都能游刃有余。

    python数据库管理应用实例

    1. **Python数据库接口(DB-API)**:Python的数据库API(PEP 249)提供了一个统一的接口,使得不同数据库系统之间的代码可移植性增强。常见的Python数据库库如`sqlite3`(SQLite)、`psycopg2`(PostgreSQL)、`...

    sqlserver数据库python帮助类.rar

    - **游标对象(Cursor)**: 在Python数据库操作中,游标用于执行SQL命令和获取结果。执行SQL后,游标会指向结果集的第一行,可以通过移动游标遍历所有结果。 - **参数化查询(Parameterized Query)**: 防止SQL注入...

    Python小程序-实现图形界面查询access数据库中的数据并展示到界面上

    这个项目对于学习Python数据库操作和GUI编程具有很高的教育价值。通过实践,开发者可以加深对数据库查询、GUI编程和Python库应用的理解。同时,这个小程序也可以作为模板,为其他类型的数据库查询应用提供基础。

    python 连接达梦数据库

    Python 连接达梦数据库 Python 连接达梦数据库是指在 Python 编程语言中连接达梦数据库,以便在 Python 应用程序中使用达梦数据库。下面是 Python 连接达梦数据库的详细步骤和知识点: 检查 Python 是否安装 在...

    Python 数据库操作 SQLAlchemy的示例代码

    ### Python 数据库操作 SQLAlchemy 的知识点概述 #### 一、数据库操作的重要性及背景 数据库操作是软件开发中的核心技能之一,特别是在需要持久化存储数据的应用场景下尤为重要。在现代软件架构中,应用程序通常...

    Python项目案例开发从入门到实战源代码第3章 数据库应用——智力问答测试

    在本项目案例中,我们将深入探讨Python在数据库应用中的实际运用,特别是一个具体的实例——智力问答测试。...实践是学习最好的方式,所以动手完成这个案例,将有助于加深对Python数据库操作的理解。

Global site tag (gtag.js) - Google Analytics