请放轻松我,我刚开始在凌晨3点开始使用Django ......
作为学校项目的一部分,我编写了一个Python脚本来抓取数据,生成SQLite3表并将Python字典中的记录插入到所述表中。此SQLite3 db的架构如下所示:
CREATE TABLE state (
id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
CREATE TABLE city (
id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
CREATE TABLE restaurant (
id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
rating FLOAT,
url VARCHAR(300),
price VARCHAR(4),
review_count INT,
street VARCHAR(100),
city VARCHAR(100),
state VARCHAR(2),
country VARCHAR(100),
zip_code INT,
phone VARCHAR(20),
image_url VARCHAR(300)
);
CREATE TABLE category (
id INT PRIMARY KEY,
title VARCHAR(100)
);
CREATE TABLE restaurant_by_category (
restaurant_id INT,
category_id INT,
FOREIGN KEY (restaurant_id) REFERENCES restaurant,
FOREIGN KEY (category_id) REFERENCES category
);
CREATE TABLE review (
url VARCHAR(300) PRIMARY KEY,
restaurant_id INT,
rating FLOAT,
name VARCHAR(100),
time VARCHAR(100),
text VARCHAR(300)
);
制作这个数据库几周后,我决定开始使用Django制作网络应用程序。我有一个(基本上)完全可操作的Django应用程序,其SQLite3后端models.py
看起来像这样:
class City(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class State(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Restaurant(models.Model):
name = models.CharField(max_length=100)
rating = models.DecimalField(max_digits=2, decimal_places=1, null=True,
blank=True)
url = models.CharField(max_length=300, blank=True, null=True)
price = models.CharField(max_length=4)
review_count = models.IntegerField(blank=True, null=True)
phone = models.CharField(max_length=14, blank=True, null=True)
image_url = models.CharField(max_length=300, blank=True, null=True)
city = models.ForeignKey(City, blank=True, null=True)
state = models.ForeignKey(State, blank=True, null=True)
state_abbreviation = models.CharField(max_length=2, blank=True, null=True)
zip_code = USZipCodeField(blank=True, null=True)
street = models.CharField(max_length=100, blank=True, null=True)
def __str__(self):
return self.name
class Review(models.Model):
url = models.CharField(max_length=300)
restaurant_id = models.IntegerField(blank=True, null=True)
rating = models.DecimalField(max_digits=2, decimal_places=1, null=True,
blank=True)
name = models.CharField(max_length=100, blank=True, null=True)
time = models.DateTimeField(blank=True, null=True)
text = models.CharField(max_length=100, blank=True, null=True)
class Category(models.Model):
title = models.CharField(max_length=100, blank=True, null=True)
class RestaurantByCategory(models.Model):
restaurant_id = models.ForeignKey(Restaurant)
category_id = models.ForeignKey(Category)
除了这两个差异之外,我之前存在的SQLite3数据库和我的Django模型几乎完全相同:
Restaurant
模型在SQLite3数据库中有一个额外的字段state_abbreviation
,实际上是state
- state
模型中的Restaurant
SQlite3数据库中没有相关字段。当我将SQLite3数据库迁移到Django时,我不关心Django模型中的state
字段是否为None
,因为数据库中只有三个状态,我可以轻松地手动添加它通过管理页面,但我做希望将SQLite3数据库中的state
属性输入到state_abbreviation
模型实例的Restaurant
字段中。
有几种字段类型不匹配,例如DateTimeField
中的Review
,USZipCodeField
中的Restaurant
或{ForeignKey
中的Restaurant
1}} ...所有这些都在我的SQLite3数据库中声明为VARCHAR
我的问题是,如何快速安全地将现有的SQLite3数据库自动迁移到我的新Django模型中?
以下是我研究的内容:
makemigrations
制作迁移文件,然后writing a RunPython
执行批量插入我的模型。这就是为什么我被困住了,无法弄清楚下一步该做什么:
前一个选项看起来有点像我想要的,除了这个例子让我觉得我必须手动为所有记录编写模型实例,这不会比只输入所有记录更好通过管理页面记录。
我也觉得字段类型不匹配和略有不同的架构(请参阅Restaurant
中的状态/ state_abbreviation属性的差异)会抛弃此迁移过程,即使有办法自动迁移我的SQLite3数据库到我的Django模型。
那么,我是否仍然坚持手动输入记录或是否有一种简单的方法来执行此迁移? SQLite3表中只有大约400条记录,所以我可以手动输入一堆来获取工作演示,然后明天展示这个项目,但在此之前我还有很多其他事情要做已完成,我宁愿不花3小时手动输入记录。
提前感谢您的帮助。