将SQLite3数据库(带有非常相似的模式)迁移到已创建的Django模型
请对我放松点,我今天凌晨3点才开始使用Django 作为学校项目的一部分,我编写了一个Python脚本来收集数据,生成SQLite3表,并将Python字典中的记录插入到这些表中。此SQLite3数据库的架构如下所示:将SQLite3数据库(带有非常相似的模式)迁移到已创建的Django模型,django,sqlite,migration,Django,Sqlite,Migration,请对我放松点,我今天凌晨3点才开始使用Django 作为学校项目的一部分,我编写了一个Python脚本来收集数据,生成SQLite3表,并将Python字典中的记录插入到这些表中。此SQLite3数据库的架构如下所示: CREATE TABLE state ( id INT PRIMARY KEY, name VARCHAR(100) NOT NULL );
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)
);
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)
制作这个数据库几周后,我决定开始使用Django制作这个web应用程序。我有一个(基本上)完全可操作的Django应用程序,带有SQLite3后端,其models.py
如下所示:
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)
);
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\u缩写
,state
模型中的Restaurant
在SQLite3数据库中没有相应字段。当我将SQLite3数据库迁移到Django时,我不在乎Django模型中的state
字段是否为状态
,因为数据库中只有三种状态,我可以通过管理页面轻松地手动添加它们,但是我确实希望SQLite3数据库中的None
属性被输入到我的state
模型实例的餐厅
字段中state\u缩写
- 存在多个字段类型不匹配,例如
中的Review
,DateTimeField
中的Restaurant
,或者USZipCodeField
中的Restaurant
。所有这些都在我的SQLite3数据库中声明为ForeignKey
VARCHAR
- 创建迁移文件,然后执行批量插入到我的模型中的功能
- 存储我先前存在的模式,然后将其加载到Django模型中
- 后面的选项(固定装置)似乎不是我想要的,因为据我所知,这只有在我从另一个数据库迁移到另一个数据库时才有效,因为新数据库和旧数据库都在我的Django应用程序中……我的情况需要从SQLite模式转储数据,我认为这是不可能的——至少不能解决我的问题
- 前一个选项似乎有点像我想要的,除了这个示例使我看起来好像无论如何都必须手动为所有记录编写模型实例,这不会比通过管理页面输入所有记录更好
- 我还觉得字段类型不匹配和模式稍有不同(请参阅
中state/state_缩写属性的差异)会中断此迁移过程,即使有办法自动从SQLite3数据库迁移到Django模型Restaurant
提前感谢您的帮助。其他选项:在Django和中重写模型;或者按原样使用数据库,谢谢@ColonelThirtyTwo--第一个链接+加上一个迁移文件帮了我的忙。@colonelthirtwo我认为这应该是一个答案(当然还有一点细节)。如果他没有回答,请加上你自己的答案解释你做了什么。因为这是一个很好的问题,所以需要额外的选项:在Django和中重写模型;或者按原样使用数据库,谢谢@ColonelThirtyTwo--第一个链接+加上一个迁移文件帮了我的忙。@colonelthirtwo我认为这应该是一个答案(当然还有一点细节)。如果他没有回答,请加上你自己的答案解释你做了什么。因为这是个好问题