本文转自:墙外行人
先说句闲话,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类什么的就什么都不要改动。