根据Django Model动态生成sql的方法

转自:http://blog.csdn.net/wenxuansoft/article/details/8039011

当定义好Django Model后,一般可以在初始化调用Syncdb方法来自动在数据库里面生成相应的表。


那么如果想在后续阶段想根据根据Django Model动态生成数据表,该怎么办呢?

要生成数据库表,就得先根据model的定义先生成SQL语句,然后在数据库里面执行。

并且由于要支持不同的数据库,所生成的SQL语句可能还有差别,如果自己去读model来生成SQL语句无疑笨办法。


好在Django提供了sql,sql_all命令来打印MODEL的 SQL语句,因此通过对分析源码,找到了办法:


比如Model定义如下:


class TestModel(models.Model):

    Name=models.CharField(max_length=64,blank=True)


>>> from django.core.management.color import no_style   

#Style是用来输出语句时着色的,没什么用


>>> from django.db import connection

>>> from django.db.backends import creation

#这里面有个类BaseDatabaseCreation,就是用来生成SQL语句的。


>>> T=TestModel()

>>> c=creation.BaseDatabaseCreation(connection)

>>>c.sql_create_model(T,no_style())[0]

['CREATE TABLE "abc" (\n    "id" integer NOT NULL PRIMARY KEY,\n    "Theme" varchar(64) NOT NULL\n)\n;']


这样就可以取得这个模型的SQL定义语句了,并且针对不同的数据库处理Django已经帮我们做好了。


有了SQL定义语句,我们就可以调用直接生成表了。


#coding:utf8

from django.core.management.base import BaseCommand
from apps.hospital.models import Province, City, Area

class Command(BaseCommand):

    def handle(self, *args, **options):
        from django.core.management.color import no_style   
        #Style是用来输出语句时着色的,没什么用

        from django.db import connection
        from django.db.backends import creation
        #这里面有个类BaseDatabaseCreation,就是用来生成SQL语句的。
        
        c = creation.BaseDatabaseCreation(connection)
        for model in [Province, City, Area]:
            T = model()
            print c.sql_create_model(T,no_style())[0][0]

        



你可能感兴趣的:(根据Django Model动态生成sql的方法)