1

我需要为现有的以前未知的表创建模型。其他人曾说过

您可以查看inspectdb代码,而不是输出代码返回类。

但对于 python 新手来说,我遇到了困难。谁能提供一个更具体的例子来说明如何做到这一点?非常感谢。

更新:我正在探索这个。看起来很有希望。似乎有几种创建动态模型的选项,其中一些虽然需要非 mySQL 数据库(请参阅stackoverflow Q)

UPDATE2:我现在可以使用以下函数在运行时创建以前未知的 mysql 表的模型。但是,当我尝试查询模型时,对于名为 'table1' 的表,我得到“表 'djangodb.subscription_table1' 不存在”)。当我将 'table1' 重命名为 'subscription_table1' 时,出现此错误:“表 'djangodb.subscription_subscription_tb2f1e1e47d73417ab2b187bc4a08bf57' 不存在”)。

帮助!

最后更新:我针对我的特定问题采用了另一种解决方案:Django - List of Dictionaries to Tables2

def getModel(table_name):
    myColumns=getColumns(table_name)


    attrs = {}
    attrs['__module__']  = 'subscription.models'

    for x,y in myColumns.items():
        fieldType = y["type"]
        if x == 'id': ''
        elif   fieldType  == "char":    attrs[x]=models.CharField(max_length='length')
        elif fieldType  == "float":   attrs[x]=models.FloatField(max_length='length')   
        elif fieldType  == "int":     attrs[x]=models.IntegerField()
        elif fieldType  == "text":    attrs[x]=models.TextField()
        else: print "AW PROB in exptDB---------------",x,y["type"],y["length"] 

    myModel = type(str(table_name), (models.Model,), attrs) 



    return myModel




def getColumns(expt_id):
    cursor = connection.cursor()
    cursor.execute("desc %s;" % (expt_id))
    exptInfo = str(cursor.fetchall())[1:-1]

    myList= exptInfo.split("""(u'""")
    myColumns = {}
    for item in myList:
        mySplit = item.replace("u'","").replace("'","").replace(" ","").split(",")
        if len(mySplit)>=2:  
            subSplit=mySplit[1].split("(")
            if len(subSplit)>=1: 
                subSplit.append('999')#does not latter.  
                myColumns[mySplit[0]]={"type":subSplit[0],"length":subSplit[1].replace(")","")}

    return myColumns
4

1 回答 1

0

您想使用该inspectdb命令。它正是为这种情况而设计的。

但是,您无需查看inspectdb代码,只需阅读以下专门针对此问题的页面:https ://docs.djangoproject.com/en/dev/howto/legacy-databases/

于 2013-01-20T16:45:48.030 回答