Django如何更新数据库

本文转自:墙外行人

先说句闲话,Git真是深似海…

总所周知Django对数据库的操作包装做的非常靓,绝大数对数据库的访问全都转变成了普通的对象访问,对Web编程而言确实是个福音吧。Manage.py中有个syncdb命令就体现出了这个意思,但是这个命令也有个缺陷:即只能创建新表,而不能对旧表做修改。什么意思呢?就是如果你一开始新建了一个Model,里面有个属性比如说Char的长度是10,后来你想改成100,只用syncdb命令是办不到,据我所知其他命令也不行,只能直接对数据库进行操作。另外,一旦数据库变得很庞大,据说有个South可以很好的处理这方面的问题,还没仔细看过,以后再说。

为了讲清楚怎么更新数据库,我们还是以例子为例子。假如一开始你有个models.py如下:

from django.db import models
 
class Book(models.Model):
     name = models.CharField(max_length = 10 )

在该Web文件的根目录下执行:

python manage.py sqlall book > book.old.sql

该book.old.sql文件长成这样:

BEGIN;
CREATE TABLE `book_book` (
     ` id ` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
     `name` varchar( 10 ) NOT NULL
)
;
COMMIT;

此时因为一些需求,你得把Book类的中name变量的max_length改成100,直接修改文件是不行的,你还得同步到数据库中;经上面所述我们必须得对数据库进行直接操作,所以修改完Book类之后,我们以同样的方式生成book.new.sql。执行以下命令得到两次的区别:

diff book.old.sql book.new.sql > book.update.sql

之后也许我们得有一点点数据库的操作知识,根据每个不同点,修改为对数据库的修改操作,如上面的例子,我们可以修改book.update.sql文件为如下update.sql文件:

use xxx;
alter table book_book modify column name varchar( 100 ) ;

其中第一行表示我们要操作的数据库名字,由xxx表示;第二行是根据刚才的book.update.sql文件,发现区别有varchar的长度,根据mysql的语法,我们简单修改为修改语句即可。接着我们只需要执行下面语句,即可完成对数据库的更新:

mysql - u root - p < update.sql

当然以上的操作还是有些烦,但是很多时候还是很实用的,比如你偶尔加一个变量只需要该成add column,偶尔加一个Model类什么的就什么都不要改动。

你可能感兴趣的:(Python)