gpt4 book ai didi

Django 模型 : change db_table dynamically

转载 作者:行者123 更新时间:2023-12-03 21:33:39 27 4
gpt4 key购买 nike

我有大量的数据集。每组数据由几个数据库表组成。数据库表集的架构是相同的。每组表可以有超过一百万行。每组数据属于一个工作,工作之间没有关系。一个或多个作业属于不同的用户。表集被导入并最终作为一组表被删除。从性能的角度来看,最好将它们保留为单独的表集。

所以我想为几个表中的每一个提供几个通用的 Django 模型。
我已经在我的views.py文件中通过使用类似这样的代码实现了它:

from foobar.models import Foo, Bar

def my_view(request):
prefix = request.GET.get('prefix')
Foo._meta.db_table = prefix + '_foo'
Bar._meta.db_table = prefix + '_bar'
....

foobar_list = Foo.objects.filter(bar_id=myval)
...

我的问题是:将这段代码与基于 Django 的 Web 应用程序的并发多个用户一起使用是否安全?模型对象是否在用户之间共享?如果同时有两个请求会发生什么?

EDIT NO 2:我已经考虑了 Lie Ryan 的回答和评论,并提出了以下代码:
from django.http import HttpResponse, HttpResponseNotFound
from django.db import models
from django.template import RequestContext, loader

def getModels(prefix):
table_map = {}

table_map["foo"] = type(str(prefix + '_foo'), (models.Model,), {
'__module__': 'foobar.models',
'id' : models.IntegerField(primary_key=True),
'foo' : models.TextField(blank=True),
})
table_map["foo"]._meta.db_table = prefix + '_foo'

table_map["bar"] = type(str(prefix + '_bar'), (models.Model,), {
'__module__': 'foobar.models',
'id' : models.IntegerField(primary_key=True),
'foo' : models.ForeignKey(prefix + '_foo', null=True, blank=True),
})
table_map["bar"]._meta.db_table = prefix + '_bar'

return table_map

def foobar_view(request):
prefix = request.GET.get('prefix')
if prefix != None and prefix.isdigit():
table_map = getModels(prefix)
foobar_list = table_map["bar"].objects.filter.order_by('foo__foo')
template = loader.get_template('foobar/foobar.html')
context = RequestContext(request, {
'foobar_list': foobar_list,
})
return HttpResponse(template.render(context))
else:
return HttpResponseNotFound('<h1>Page not found</h1>')

现在我的问题是,编辑后的代码的第二稿对于并发的多个用户是否安全?

最佳答案

这种技术称为分片。不,如果您使用线程处理并发请求,这样做是不安全的。

您可以做的是动态构造多个指向不同db_tables的类,并使用工厂来选择正确的类。

tables = ["foo", "bar"]
table_map = {}
for tbl in tables:
class T(models.Model):
db_table = tbl
... table definition ...
table_map[tbl] = T

然后创建一个函数,根据您对数据的分片方式选择正确的 table_map。

如果您接受用户输入的表名,也要小心注入(inject)。

或者,像 PostgrSQL 这样的一些数据库系统允许每个数据库有多个模式,这可能是在某些情况下分离数据的更好方法。

关于Django 模型 : change db_table dynamically,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25477522/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com