Django 数据库奇怪的行为 - 开发服务器正在加载大约几分钟
Django database strange behavior - dev server is loading about minutes
拜托,我发送了最后几天与 db 和 django 的战斗。
我的问题是: 我有 500 Mb 大的数据库...在数据库中没有任何 many_to_many,foreing 等所以表不是独立的其他。在 Django 中,我使用 inspectdb 创建了模型。我的问题是,一旦我调用 runserver,我必须在服务器启动之前等待大约 5 分钟。我已经尝试通过使用 python -vv manage.py runserver 进行调试,以查看服务器卡住的位置,并且总是在尝试连接到数据库时出现。
我尝试过与 MySQL、PostgreSQL、MSSQL 相同的数据库结构,但所有数据库的行为都相同。同样在不同的机器和不同的 django 版本上。
一旦我创建了没有数据的数据库转储,只有数据库结构,所以数据库的大小大约为 16Kb,并且比 Django 服务器启动快(毫秒)。
我使用 django 版本 1.9.5 但也尝试过 1.8
请大家多多指教,实际上我已经想不出在哪里搜索问题了。
谢谢
所以,经过几天的调试和 IRC 询问后,我明白了为什么 runserver(以及几乎每个 manage.py 命令)花费这么长时间的原因。
Django 似乎不检查 views.py 中的 SQL 查询,而我的大部分 SQL 查询都在那里。但是我的 forms.py 中有两个简单的查询来填充我的表单中的下拉列表,这导致了整个问题。
所以现在我知道问题出在哪里了,但我正在考虑如何解决它。
事情是我需要我的表格中的模型数据。
我的表格看起来是:
def get_vendor_set():
"""
Returns set of contributors to use as choices
"""
vendor_set = [
('Availability', 'Availability'),
('No Competitor', 'No Competitor'),
('Popularity', 'Popularity'),
]
contrib = CompetitorLastPrice.objects.order_by('vendor')
for con in contrib:
vendor_set.append((con.vendor,con.vendor))
return sorted(set(vendor_set))
def get_sorg_set():
"""
Return set of sorg to use as choices
"""
sorg_set = []
sorg_cursor = CltSorg.objects.all()
for sorg in sorg_cursor:
sorg_set.append((sorg.sorg, sorg.sorg +' - '+ sorg.sorg_description))
return sorg_set
class FamilyForm(forms.ModelForm):
class Meta:
model = Family
fields = ['name', 'family_number', 'price_list', 'sorg', 'filter', 'linearity']
widgets = {
'sorg': forms.Select(choices=get_sorg_set()),
}
class CustomInlineFormset(BaseInlineFormSet):
"""
Custom formset that support initial data
"""
...
...
ContribFormSet = inlineformset_factory(Family, Templates, formset=CustomInlineFormset,
fields='__all__', min_num=1, extra=0,
widgets={'contributor' : forms.Select(choices=get_vendor_set())}
)
问题导致那些小部件...
有没有其他方法可以将数据从 forms.py 中的某个地方获取到初始表单(到选择列表)...我正在考虑以某种方式在 views.py 中进行。
感谢您的回答。
V.
拜托,我发送了最后几天与 db 和 django 的战斗。
我的问题是: 我有 500 Mb 大的数据库...在数据库中没有任何 many_to_many,foreing 等所以表不是独立的其他。在 Django 中,我使用 inspectdb 创建了模型。我的问题是,一旦我调用 runserver,我必须在服务器启动之前等待大约 5 分钟。我已经尝试通过使用 python -vv manage.py runserver 进行调试,以查看服务器卡住的位置,并且总是在尝试连接到数据库时出现。
我尝试过与 MySQL、PostgreSQL、MSSQL 相同的数据库结构,但所有数据库的行为都相同。同样在不同的机器和不同的 django 版本上。
一旦我创建了没有数据的数据库转储,只有数据库结构,所以数据库的大小大约为 16Kb,并且比 Django 服务器启动快(毫秒)。
我使用 django 版本 1.9.5 但也尝试过 1.8
请大家多多指教,实际上我已经想不出在哪里搜索问题了。
谢谢
所以,经过几天的调试和 IRC 询问后,我明白了为什么 runserver(以及几乎每个 manage.py 命令)花费这么长时间的原因。 Django 似乎不检查 views.py 中的 SQL 查询,而我的大部分 SQL 查询都在那里。但是我的 forms.py 中有两个简单的查询来填充我的表单中的下拉列表,这导致了整个问题。
所以现在我知道问题出在哪里了,但我正在考虑如何解决它。 事情是我需要我的表格中的模型数据。
我的表格看起来是:
def get_vendor_set():
"""
Returns set of contributors to use as choices
"""
vendor_set = [
('Availability', 'Availability'),
('No Competitor', 'No Competitor'),
('Popularity', 'Popularity'),
]
contrib = CompetitorLastPrice.objects.order_by('vendor')
for con in contrib:
vendor_set.append((con.vendor,con.vendor))
return sorted(set(vendor_set))
def get_sorg_set():
"""
Return set of sorg to use as choices
"""
sorg_set = []
sorg_cursor = CltSorg.objects.all()
for sorg in sorg_cursor:
sorg_set.append((sorg.sorg, sorg.sorg +' - '+ sorg.sorg_description))
return sorg_set
class FamilyForm(forms.ModelForm):
class Meta:
model = Family
fields = ['name', 'family_number', 'price_list', 'sorg', 'filter', 'linearity']
widgets = {
'sorg': forms.Select(choices=get_sorg_set()),
}
class CustomInlineFormset(BaseInlineFormSet):
"""
Custom formset that support initial data
"""
...
...
ContribFormSet = inlineformset_factory(Family, Templates, formset=CustomInlineFormset,
fields='__all__', min_num=1, extra=0,
widgets={'contributor' : forms.Select(choices=get_vendor_set())}
)
问题导致那些小部件... 有没有其他方法可以将数据从 forms.py 中的某个地方获取到初始表单(到选择列表)...我正在考虑以某种方式在 views.py 中进行。
感谢您的回答。
V.