" Django数据库转换为PostgreSQL"

2024-06-02 10:18:51 发布

您现在位置:Python中文网/ 问答频道 /正文

大约有5000家公司,每家公司的价格都在4500美元左右,总价格在2200万美元左右。你知道吗

不久前,我写了一段代码,以这样的格式存储数据-

class Endday(models.Model):
  company = models.TextField(null=True)
  eop = models.CommaSeparatedIntegerField(blank=True, null=True, max_length=50000)

为了存储,代码是-

for i in range(1, len(contents)):
  csline = contents[i].split(",")
  prices = csline[1:len(csline)]
  company = csline[0]
  entry = Endday(company=company, eop=prices)
  entry.save()

虽然代码很慢(很明显),但它确实可以工作并将数据存储在数据库中。有一天,我决定删除Endday的所有内容,并再次尝试存储。但它没有工作抛出一个错误Database locked。你知道吗

总之,我做了一点研究,知道MySql不能处理这么多的数据。那么它最初是如何储存的呢?我得出的结论是,所有这些价格都是存储在一开始,之后很多都存储在数据库中,所以这将不会得到存储。你知道吗

经过一点研究,我知道我应该使用PostgreSql,所以我改变了数据库,进行了迁移,然后继续尝试代码,但没有成功。我错在说-

psycopg2.DataError: value too long for type character varying(50000)

好吧,我想让我们试着使用bulk_create并对代码进行了一点修改,但我也遇到了同样的错误。你知道吗

下一步,我想也许让我们做两个模型,一个是公司名称,另一个是价格和那家公司的钥匙。所以我再次修改了密码-

class EnddayCompanies(models.Model):
  company = models.TextField(max_length=500)

class Endday(models.Model):
  foundation = models.ForeignKey(EnddayCompanies, null=True)
  eop = models.FloatField(null=True)

还有那些观点-

to_be_saved = []
for i in range(1, len(contents)):
  csline = contents[i].split(",")
  prices = csline[1:len(csline)]
  company = csline[0]
  companies.append(csline[0])
  prices =[float(x) for x in prices]
  before_save = []
  for j in range(len(prices)):
    before_save.append(Endday(company=company, eop=prices[j]))
  to_be_saved.append(before_save)
Endday.objects.bulk_create(to_be_saved)

但令我惊讶的是,这是如此缓慢,在中间,它只是停止了对一家公司。我试着找出哪一个特定的代码减慢了速度,结果是-

before_save = []
  for j in range(len(prices)):
    before_save.append(Endday(company=company, eop=prices[j]))
  to_be_saved.append(before_save)

好吧,现在我又回到原点了,我什么都想不起来了,所以我按了那个钟。我现在的问题是-

  • 这个怎么办?你知道吗
  • 为什么save能用MySql工作?你知道吗
  • 有没有更好的办法?(当然有)
  • 如果有,是什么?你知道吗

Tags: 代码intrueforlenmodelssave公司
1条回答
网友
1楼 · 发布于 2024-06-02 10:18:51

我认为您可以为CompanyPrice创建一个单独的模型,如下所示:

class Company(models.Model):
    name = models.CharField(max_length=20)

class Price(models.Model):
    company = models.ForeignKey(Company, related_name='prices')
    price = models.FloatField()

以下是保存数据的方式:

# Assuming that contents is a list of strings with a format like this:
contents = [
    'Company 1, 1, 2, 3, 4...',
    'Company 2, 1, 2, 3, 4...',
    ....
]

for content in contents:
    tokens = content.split(',')
    company = Company.objects.create(name=tokens[0])
    Price.objects.bulk_create(
        Price(company=company, price=float(x.strip()))
        for x in tokens[1:]
    )
    # Then you can call prices now from company
    company.prices.order_by('price')

更新:我注意到它与第二个实现类似,唯一的区别是保存数据的方式。我的实现迭代次数较少。你知道吗

相关问题 更多 >