Как я могу создать правильный sql-запрос из этой модели django?

Я пытаюсь вставить данные, полученные с помощью скраппинга, в БД, созданную следующими моделями. Однако, я понял, что использование bulk_create от django или внешней библиотеки на его основе, bulk_create_or_update, скорее всего, сделает логику слишком сложной. (Я чувствовал, что orm должен использоваться для простого CRUD и т.д.)

Поэтому я думаю использовать Row SQL для сохранения данных, как для удобства обслуживания, так и для скорости.

Я совсем не знаком с sql, поэтому хотел бы получить от вас совет.

Какой код SQL предпочтительнее этого?

Каждая страница, которую нужно соскрести, содержит несколько частей информации, и всего есть несколько страниц. Я хотел бы сначала соскрести все страницы, добавить их в словарь, а затем сохранить их в пакетном режиме с помощью sql, но я не знаю лучшего способа сделать это.

from django.db import models
from django.forms import CharField


# Create your models here.
# province
class Prefecture(models.Model):
    name=models.CharField("都道府県名",max_length=10)
     
# city
class City(models.Model):
    prefecture = models.ForeignKey(Prefecture, on_delete=models.CASCADE, related_name='city')
    name=models.CharField("市区町村名",max_length=10)

# seller
class Client(models.Model):
    prefecture = models.ForeignKey(Prefecture, on_delete=models.CASCADE, related_name='client',null=True,blank=True)
    city = models.ForeignKey(City, on_delete=models.CASCADE, related_name='client',null=True,blank=True)
    department = models.CharField("部局",max_length=100)


# detail
class Project(models.Model):
    name = models.CharField("案件名",max_length=100)
    serial_no = models.CharField("案件番号",max_length=100,null=True,blank=True)
    client = models.ForeignKey(Client, on_delete=models.CASCADE, related_name='project')
    # etc...

# file
class AttachedFile(models.Model):
    project = models.ForeignKey(Project, on_delete=models.CASCADE, related_name='attach_file')
    name = models.CharField(max_length=100)
    path = models.CharField(max_length=255)

# bid company
class Bidder(models.Model):
    name = models.CharField("入札業者名",max_length=100)
    prefecture = models.ForeignKey(Prefecture, on_delete=models.CASCADE, related_name='bidder',null=True,blank=True)
    city = models.ForeignKey(City, on_delete=models.CASCADE, related_name='bidder',null=True,blank=True)
# etc...
    

# result
class BidResult(models.Model):
    project = models.ForeignKey(Project, on_delete=models.CASCADE, related_name='bid_result')
    bidder = models.ForeignKey(Bidder, on_delete=models.CASCADE, related_name='bid_result')

Я не думаю, что вы получите резкое увеличение производительности, используя raw SQL вместо orm. Кроме того, Orm можно использовать для сложных операций, а такие операции, как массовое обновление и массовое создание, не являются сложными и быстрыми, как обычный необработанный SQL. Все может идти медленно с ORM, когда вы пытаетесь получить записи в память и затем выполнить операции, но в вашем случае это обновление и создание, которые могут быть легко выполнены с помощью Django ORM. Что касается использования функции, выполняющей update_or_create, то использование внешней библиотеки не повлияет на производительность, но использование необработанного SQL для незначительного увеличения скорости может повлиять на сопровождаемость кода, как вы уже сказали, вы не очень хорошо знакомы с необработанным sql.

Вернуться на верх