我正在开发一个将使用多个数据库后端的Django应用程序。我想在运行django应用程序的机器上放一个sqlite数据库,并同步到远程mysql数据库。棘手的部分是运行应用程序的这台机器并不总是有互联网连接,所以mysql数据库并不总是可用的。将有多台机器运行该应用程序,每台机器都有自己的本地sqlite数据库,但都使用相同的远程mysql数据库。
我还没有编写代码,但这是我的想法。每次运行插入或更新时,我都希望将其写入两个数据库,除非远程数据库不可用,在这种情况下,我将sql语句保存在本地数据库的表中,以便在远程数据库可用时运行。
这可以用数据库路由器完成,还是我需要用每个db语句手动实现它?
关于PK的注意事项:没有直接关系,但肯定会被问到。主键将在每台机器上本地生成。在mysql DB中,将有一个用于此键的字段,以及一个具有应用程序每个实例的唯一标识符的字段,它们将共同提供唯一键。
答案 0 :(得分:3)
假设您有一个名为Blog的模型,那么您可以使用以下内容在本地和远程存储它(假设您已配置对远程数据库的访问权限)。
blog = Blog('test')
blog.save() #Assuming that sqlite is the default db
try:
blog.save(using='mysql')
except NoInternetConnection:
pass
确保在settings.py中定义并配置了“mysql”,并确保在没有Internet连接时处理这些情况。
旁注:我不太清楚为什么你真的想要这样做。如果这是为了备份目的,那么我将使用标准备份程序。有关使用多个数据库的详细信息,请参阅:http://docs.djangoproject.com/en/dev/topics/db/multi-db/#using-raw-cursors-with-multiple-databases
答案 1 :(得分:3)
我拿了DrDee的代码并将其附加到post_save信号(帮助+1)。
@receiver(models.signals.post_save) #new signal decorator in Django 1.3
def save_to_remote(sender,instance,using,**kwargs):
if using == 'default' and instance.__module__ == 'mymodel.myapp.models':
try:
instance.save(using='remote')
except:
pending_instance=Pending_Remote(
pk_default=instance.pk,
model_default=instance.__class__.__name__
)
pending_instance.save()
这也保存了未保存到远程数据库的记录。请注意,Pending_Remote模型不得位于“myapp”中。