【问题标题】:Django -- Empty database when inspectdb is usedDjango——使用inspectdb时为空数据库
【发布时间】:2014-06-23 14:46:52
【问题描述】:

我正在尝试关注以下文档:https://docs.djangoproject.com/en/1.6/howto/legacy-databases/

首先,我将数据库添加到 settings.py,然后输入

python manage.py inspectdb

这是输出。对不起,这太长了;希望你只需要看大局。

我的问题是

1) 我不知道怎么往数据库里放东西(当我用文本编辑器打开数据库时,它只是随机字符)

2) 如果我运行 python manage.py sqlcustom [app name] 则没有任何输出

3) 可能由于上述两个原因,导入的数据库在 Django 中显示为空。当我在 shell 中键入 Bonds.objects.all() 时,它会返回一个空列表,但应该有很多(我已经确认)。

# This is an auto-generated Django model module.
# You'll have to do the following manually to clean this up:
#   * Rearrange models' order
#   * Make sure each model has one field with primary_key=True
#   * Remove `managed = False` lines if you wish to allow Django to create and delete the table
# Feel free to rename the models, but don't rename db_table values or field names.
#
# Also note: You'll have to insert the output of 'django-admin.py sqlcustom [appname]'
# into your database.
from __future__ import unicode_literals

from django.db import models

class AuthGroup(models.Model):
    id = models.IntegerField(primary_key=True)
    name = models.CharField(unique=True, max_length=80)
    class Meta:
        managed = False
        db_table = 'auth_group'

class AuthGroupPermissions(models.Model):
    id = models.IntegerField(primary_key=True)
    group_id = models.IntegerField()
    permission = models.ForeignKey('AuthPermission')
    class Meta:
        managed = False
        db_table = 'auth_group_permissions'

class AuthPermission(models.Model):
    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=50)
    content_type_id = models.IntegerField()
    codename = models.CharField(max_length=100)
    class Meta:
        managed = False
        db_table = 'auth_permission'

class AuthUser(models.Model):
    id = models.IntegerField(primary_key=True)
    password = models.CharField(max_length=128)
    last_login = models.DateTimeField()
    is_superuser = models.BooleanField()
    username = models.CharField(unique=True, max_length=30)
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    email = models.CharField(max_length=75)
    is_staff = models.BooleanField()
    is_active = models.BooleanField()
    date_joined = models.DateTimeField()
    class Meta:
        managed = False
        db_table = 'auth_user'

class AuthUserGroups(models.Model):
    id = models.IntegerField(primary_key=True)
    user_id = models.IntegerField()
    group = models.ForeignKey(AuthGroup)
    class Meta:
        managed = False
        db_table = 'auth_user_groups'

class AuthUserUserPermissions(models.Model):
    id = models.IntegerField(primary_key=True)
    user_id = models.IntegerField()
    permission = models.ForeignKey(AuthPermission)
    class Meta:
        managed = False
        db_table = 'auth_user_user_permissions'

class Bonds(models.Model):
    bond_id = models.TextField(blank=True)
    end_d = models.DateField(blank=True, null=True)
    intr = models.FloatField(blank=True, null=True)
    base_i = models.FloatField(blank=True, null=True)
    type = models.TextField(blank=True)
    start_d = models.DateField(blank=True, null=True)
    first_id = models.DateField(blank=True, null=True)
    first_pd = models.DateField(blank=True, null=True)
    class Meta:
        managed = False
        db_table = 'bonds'

class Combos(models.Model):
    type = models.TextField(blank=True)
    f_prop = models.FloatField(blank=True, null=True)
    f_start = models.IntegerField(blank=True, null=True)
    f_end = models.IntegerField(blank=True, null=True)
    b_prop = models.FloatField(blank=True, null=True)
    b_start = models.IntegerField(blank=True, null=True)
    b_end = models.IntegerField(blank=True, null=True)
    a_prop = models.FloatField(blank=True, null=True)
    a_start = models.IntegerField(blank=True, null=True)
    a_end = models.IntegerField(blank=True, null=True)
    class Meta:
        managed = False
        db_table = 'combos'

class DjangoAdminLog(models.Model):
    id = models.IntegerField(primary_key=True)
    action_time = models.DateTimeField()
    user = models.ForeignKey(AuthUser)
    content_type = models.ForeignKey('DjangoContentType', blank=True, null=True)
    object_id = models.TextField(blank=True)
    object_repr = models.CharField(max_length=200)
    action_flag = models.PositiveSmallIntegerField()
    change_message = models.TextField()
    class Meta:
        managed = False
        db_table = 'django_admin_log'

class DjangoContentType(models.Model):
    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=100)
    app_label = models.CharField(max_length=100)
    model = models.CharField(max_length=100)
    class Meta:
        managed = False
        db_table = 'django_content_type'

class DjangoSession(models.Model):
    session_key = models.CharField(unique=True, max_length=40)
    session_data = models.TextField()
    expire_date = models.DateTimeField()
    class Meta:
        managed = False
        db_table = 'django_session'

class DjangoSite(models.Model):
    id = models.IntegerField(primary_key=True)
    domain = models.CharField(max_length=100)
    name = models.CharField(max_length=50)
    class Meta:
        managed = False
        db_table = 'django_site'

class FxRates(models.Model):
    type = models.TextField(blank=True)
    fx_rate = models.FloatField(blank=True, null=True)
    class Meta:
        managed = False
        db_table = 'fx_rates'

class NotendurDocument(models.Model):
    id = models.IntegerField(primary_key=True)
    docfile = models.CharField(max_length=100)
    user = models.ForeignKey(AuthUser)
    class Meta:
        managed = False
        db_table = 'notendur_document'

class Types(models.Model):
    type = models.TextField(blank=True)
    cal = models.TextField(blank=True) # This field type is a guess.
    ind = models.TextField(blank=True)
    paypy = models.IntegerField(blank=True, null=True)
    loan_type = models.TextField(blank=True)
    adj_intr_date = models.NullBooleanField()
    class Meta:
        managed = False
        db_table = 'types'

【问题讨论】:

    标签: python database django


    【解决方案1】:

    您是否按照其他说明进行操作?您需要将inspectdb 的输出添加到您的一个应用程序中的models.py 文件中,然后将该应用程序添加到您的INSTALLED_APPS

    尝试以下方法:

    1) 创建应用

    如果您没有想要将inspectdb 的输出放入的应用程序,只需运行python manage.py startapp legacy。这将创建一个名为 legacy 的应用程序,您可以通过该应用程序同步现有数据库。

    2) 将 inspectdb 输出添加到应用的模型文件中

    在所选应用的models.py 文件中,粘贴inspectdb 命令的输出。最简单的方法可能是运行python manage.py inspectdb > models.py。这将在包含manage.py 和您的应用程序目录的同一目录中创建一个名为models.py 的文件。将该文件的输出复制到您应用中的models.py 文件中,即legacy/models.py 中。

    3) 将您的应用添加到 INSTALLED_APPS

    在您的settings.py 中,将您的应用添加到INSTALLED_APPS。在此示例中,您希望将 'legacy', 添加到 INSTALLED_APPS

    4) 运行同步数据库

    运行python manage.py syncdb 以确保包含所有必需的表。看起来你已经有了基于上面粘贴的输出的那些,但再次运行它不会有什么坏处。

    【讨论】:

    • 感谢您的回复。我已经完成了这些步骤,只是我只是将输出复制粘贴到应用程序中。
    • 你把它放在app的models.py文件里了吗?
    • 刚刚注意到您的一些模型缺少主键,这是 Django 所要求的。不确定这是否是您的问题,但请尝试将 id = models.AutoField(primary_key=True) 添加到没有 pk 的模型中。
    • 好收获。不幸的是,问题仍然存在。
    • 我猜 b/c 添加该行实际上并不会更改数据库以添加 pk。你能编辑这个数据库吗?也许进入sql代码并为那些缺少它们的模型添加一个pk字段,然后再次运行inspectdb
    【解决方案2】:

    我找到了答案,而且很明显:数据库路由。您需要创建一个routers.py 文件并将其添加到您的settings.py

    DATABASE_ROUTERS = ['myapp1.routers.name-of-your-routers.py-class',
                        'myapp2.routers.name-of-your-routers.py-class']
    DATABASE_APPS_MAPPING = {'myapp1': 'mydb1', 
                             'myapp2':'mydb2'}
    

    Djangosn-ps 有 routers.py 文件:https://djangosnippets.org/snippets/2687/

    您需要在 models.py 的每个类的 Meta 类中添加一个名为 in_db = 'desired-db' 的属性。

    【讨论】:

      猜你喜欢
      • 2011-06-22
      • 2016-10-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-22
      • 2019-12-03
      • 2019-08-30
      • 2011-05-17
      • 1970-01-01
      相关资源
      最近更新 更多