Chinaunix首页 | 论坛 | 博客
  • 博客访问: 26267254
  • 博文数量: 2065
  • 博客积分: 10377
  • 博客等级: 上将
  • 技术积分: 21525
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-04 17:50
文章分类

全部博文(2065)

文章存档

2012年(2)

2011年(19)

2010年(1160)

2009年(969)

2008年(153)

分类: Python/Ruby

2009-05-13 20:04:49

1.建立DB连接顺序
创建数据库连接、创建数据库游标、执行某个语句、然后关闭数据库
db = MySQLdb.connect(user='me',db='mydb',passwd='serect',host='localhost')#建立起连接
cursor=db.cursor()#创建游标
cursor.execute('select name from test')
names=
db.close()
谨记:不要在JSP页面写DB连接。同样的不要在视图页中写DB逻辑
理想情况下,应对所使用的数据库服务器进行抽象,这样一来只在一处修改即可变换数据库服务器。
可以抽象出来一层DB。专门负责DB
让我们对数据存取进行抽象,用单独一层负责数据显示,然后在中间放置一层来进行控制

Django 紧紧地遵循这种 MVC 模式,可以称得上是一种 MVC 框架。以下是 Django MV C 各自的含义:

§                     M ,数据存取部分,由django数据库层处理,本章要讲述的内容。

§                     V ,选择显示哪些数据要及怎样显示的部分,由视图和模板处理。

§                     C ,根据用户输入委派视图的部分,由 Django 框架通过按照 URLconf 设置,对给定 URL 调用合适的 python 函数来自行处理。

由于 C 由框架自行处理,而 Django 里更关注的是模型(Model)、模板(Template)和视图(Views),Django 也被称为MTV 框架 。在 MTV 开发模式中:

§                     M 代表模型(Model),即数据存取层。该层处理与数据相关的所有事务:如何存取、如何确认有效性、包含哪些行为以及数据之间的关系等。

§                     T 代表模板(Template),即表现层。该层处理与表现相关的决定:如何在页面或其他类型文档中进行显示。

§                     V 代表视图(View),即业务逻辑层。该层包含存取模型及调取恰当模板的相关逻辑。你可以把它看作模型与模板之间的桥梁。

2.数据库配置

象前面章节提到的 TEMPLATE_DIRS 一样,数据库配置也是在Django的配置文件里,缺省 settings.py 

DATABASE_ENGINE = ''           # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'.
DATABASE_NAME = ''             # Or path to database file if using sqlite3.
DATABASE_USER = ''             # Not used with sqlite3.
DATABASE_PASSWORD = ''         # Not used with sqlite3.
DATABASE_HOST = ''             # Set to empty string for localhost. Not used with sqlite3.
DATABASE_PORT = ''             # Set to empty string for default. Not used with sqlite3.

将DB的配置信息写完整。

输入完设置后,测试一下配置情况。首先,转到在第二章创建的 mysite 项目目录,运行 python manage.py shell 命令。 这个命令主要是用来作测试用的。

>>> from django.db import connection

>>> cursor = connection.cursor()

如果没有显示什么错误信息,那么你的数据库配置是正确的。否则,你就得 查看错误信息来纠正错误。表 5-2 是一些常见错误。

编写Python代码是非常有趣的,保持用Python的方式思考会避免你的大脑在不同领域来回切换。 这可以帮助你提高生产率。不得不去重复写SQL,再写Python代码,再写SQL,会让你头都要裂了。{始终用PYTHON来思考}

第一个模型:

1.编写模型代码

from django.db import models
class Publisher(models.Model):

    name = models.CharField(maxlength=30)

    address = models.CharField(maxlength=50)

    city = models.CharField(maxlength=60)

    state_province = models.CharField(maxlength=30)

    country = models.CharField(maxlength=50)

    website = models.URLField()

 

class Author(models.Model):

    salutation = models.CharField(maxlength=10)

    first_name = models.CharField(maxlength=30)

    last_name = models.CharField(maxlength=40)

    email = models.EmailField()

    headshot = models.ImageField(upload_to='/tmp')

 

class Book(models.Model):

    title = models.CharField(maxlength=100)

    authors = models.ManyToManyField(Author)

    publisher = models.ForeignKey(Publisher)

    publication_date = models.DateField()

2.安装模型

完成这些代码之后,现在让我们来在数据库中创建这些表。要完成该向 工作,第一步是在 Django 项目中 激活 这些模型。将books app 添加到配置文件的已 installed apps 列表中即可完成此步骤。

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'mysite.hello',
)  #将我们的应用mysite.hello应用添加进来

现在我们可以创建数据库表了。首先,用下面的命令对校验模型的有效性:

python manage.py validate #命令检查你的模型的语法和逻辑是否正确(模型正确与否)

python manage.py sqlall books #sqlall 命令并没有在数据库中真正创建数据表,只是把SQL语句段打印出来  其中的books表示的是当前的WEB应用的名称

python manage.py syncdb  方法来执行这些SQL语句 可以执行这些SQL语句

到此DB已经可以在数据库中创建了哦。开始去执行一些数据操作了包括插入记录、更新等。

基本数据访问

现在我如果需要插入一条记录就不需要像之前那样做了用SQL执行的。可以直接这样操作就搞定了。

from books.models import Publisher

>>> p1 = Publisher(name='Addison-Wesley', address='75 Arlington Street',

...     city='Boston', state_province='MA', country='U.S.A.',

...     website='')#定义好一个模块构造方法

>>> p1.save()#这样就搞定了非常地方便啊!

插入和更新数据

第一步

>>> p = Publisher(name='Apress',

...         address='2855 Telegraph Ave.',

...         city='Berkeley',

...         state_province='CA',

...         country='U.S.A.',

...         website='')

   第二步:>>> p.save()

返回来一个自增长的ID值可以通过p.id打印出来看到的。也可以查一个DB看看确实存在了一个自增长的ID字段进来了。

如果接下来再进行一次save操作的话那就相当于执行了update操作了。

接下来再调用 save() 将不会创建新的记录,而只是修改记录内容(也就是 执行 UPDATE SQL语句,而不是 INSERT 语句):

>>> p.name = 'Apress Publishing'

>>> p.save() #就相当于update操作了

选择对象:

  整理一下在Django中如何实现跟SQL的动作一样的。比如说实现insert的话在django如何写

1.Django代码

>>> Publisher.objects.all()

相当于SQL的  SELECT id, name, address, city, state_province, country, website FROM book_publisher;

2.Django代码

Publisher.objects.filter(name="Apress Publishing"){where条件过滤}

相当于SQL的WHERE过滤 SELECT id, name, address, city, state_province, country, website FROM book_publisher WHERE name = 'Apress Publishing'

如果条件有多个的话可以这样写Publisher.objects.filter(country="U.S.A.", state_province="CA")   相当条件where country="U.S.A." and state_province

如果想实现where condition like '%A%'可用:Publisher.objects.filter(name__contains="press") 双下划线 表示like了

类似的SQL中的between and 等相关的操作。都是能够在Django中找到相关的代码实现的。

3.实现数据排序就是SQL中的order by 操作

Publisher.objects.order_by("name") 相当的SQL代码如下的:

SQL语句:SELECT id, name, address, city, state_province, country, website
FROM book_publisher ORDER BY name;

如果有两个order by 的话如何实现呢Publisher.objects.order_by("state_provice", "address")

如果是倒序:Publisher.objects.order_by("-name")

这个排序的话也可以在MODEL中定义好:

**class Meta:**
       **ordering = ["name"]**   #事先指定好那以后就不用去管它了。

4. 限制返回的数据

Publisher.objects.all()[0] 

SQL:limit 1   限制了返回的记录个数为1条

5.删除对象

>>> p = Publisher.objects.get(name="Addison-Wesley")
>>> p.delete()         相当于执行了delete from 表名 where name=''

通常更好的方法是给你的数据模型添加激活标志。你可以只在激活的对象中查找, 对于不需要的对象,将激活字段值设为 False , 而不是删除对象。这样, 如果一旦你认为做错了的话,只需把标志重设回来就可以了。 {解决错删数据的方法!}

6. 修改数据表结构

添加字段信息:

删除字段信息:1.从模型中删除掉此字段信息并重启服务器。2.ALTER TABLE books_book DROP COLUMN num_pages; #直接删除掉在数据库中直接删除掉。

7.删除模型:

第一步:删除掉models中这个模型对应的代码。

第二步:去数据库中将对应的表删除掉。




阅读(690) | 评论(4) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-11-26 15:28:27

expect

chinaunix网友2010-11-26 14:09:47

有时间就学习内核

chinaunix网友2010-11-26 14:06:01

目前开源项目服务器管理平台 下一个是XEN管理平台

hkebao2010-03-11 10:14:51

null=True 如果在定义模型字段的时候定义了这个条件的话 则保存的时候可以不用填写内容的。