我有一个使用SQLite数据库的应用程序,一切都按照应有的方式工作.我现在正在添加需要第二个SQLite数据库的新功能,但我很难弄清楚如何从不同的数据库连接表.
如果有人可以帮我解决这个问题,我真的很感激!
编辑:请参阅此问题以获取示例案例,您可以在附加数据库时调整您的语言,如接受的答案中所述.
我知道Django不支持跨多个数据库的外键(最初是Django 1.3 docs)
但我正在寻找一种解决方法.
我在一个单独的数据库上有两个模型.
routers.py:
class NewsRouter(object):
def db_for_read(self, model, **hints):
if model._meta.app_label == 'news_app':
return 'news_db'
return None
def db_for_write(self, model, **hints):
if model._meta.app_label == 'news_app':
return 'news_db'
return None
def allow_relation(self, obj1, obj2, **hints):
if obj1._meta.app_label == 'news_app' or obj2._meta.app_label == 'news_app':
return True
return None
def allow_syncdb(self, db, model):
if db == 'news_db':
return model._meta.app_label == 'news_app'
elif model._meta.app_label == 'news_app':
return False
return None
Run Code Online (Sandbox Code Playgroud)
fruit_app/models.py中的模型1:
from django.db import models
class Fruit(models.Model):
name …Run Code Online (Sandbox Code Playgroud) 我想知道,如果它是用在InnoDB中可能MySQL有一个table与外键引用在不同的另一个表database?
如果是这样,如何做到这一点?
我想在django中使用postgreSQL模式,我该怎么做?
我有两个不同数据库的2个模型:
数据库是手动创建的,但它不会改变任何东西.
class LinkModel(models.Model): # in 'urls' database
id = models.AutoField(primary_key=True)
host_id = models.IntegerField()
path = models.CharField(max_length=255)
class Meta:
db_table = 'links'
app_label = 'testapp'
def __unicode__(self):
return self.path
class NewsModel(models.Model): # in default database
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=50)
link = models.ForeignKey(LinkModel)
class Meta:
db_table = 'news'
app_label = 'test'
def __unicode__(self):
return self.title
Run Code Online (Sandbox Code Playgroud)
在以下代码之后出现错误
newsItem, created = NewsModel.objects.get_or_create( title="test" )
link = LinkModel.objects.using('urls').get( id=1 )
newsItem.link = link # error!
Cannot assign "<LinkModel: />": instance is on …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Django构建一些数据库前端,因为我喜欢一般的MVC结构以及他们的模板系统和管理界面.但是,我在使用PostgreSQL后端的某些方面遇到了问题.
我已经设法弄清楚如何使用settings.py文件的数据库部分指定不同的模式(和数据库),如下所示:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
},
'MPS': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'OPTIONS': {
'options': '-c search_path=django'
},
'NAME': 'sandbox_manzer',
'HOST': '192.168.2.151',
'PORT': '5434',
'USER': '******',
'PASSWORD': '**********************',
}
}
Run Code Online (Sandbox Code Playgroud)
然而,当我尝试和脚本一些基本的测试,详见这里,我遇到一个问题.我的用户可以很好地创建数据库,以便我的test_db构建,但是当django应用程序将模型构建到表中时,我得到一个错误,指出No schema is specifiedtest_db.我将非常感谢有关如何为test_db指定模式名称的任何帮助.特别是因为我打算使用不同的模式作为逻辑分隔符为单个项目构建多个应用程序.
谢谢!
假设我的服务器上有一个 django 应用程序,但我希望使用 django.contrib.auth.models 进行身份验证,其中用户和组模型/数据位于另一个数据库中的另一台服务器上。在 Django 中,我的数据库设置将是这样的:
DATABASES = {
'default': {},
'auth_db': {
'NAME' : 'my_auth_db',
'ENGINE' : 'django.db.backends.mysql',
'USER' : 'someuser',
'PASSWORD' : 'somepassword',
'HOST' : 'some.host.com',
'PORT' : '3306',
},
'myapp': {
'NAME': 'myapp_db',
'ENGINE': 'django.db.backends.mysql',
'USER': 'localuser',
'PASSWORD': 'localpass',
}
}
DATABASE_ROUTERS = ['pathto.dbrouters.AuthRouter', 'pathto.dbrouters.MyAppRouter']
Run Code Online (Sandbox Code Playgroud)
第一个问题:这是否有效,即它是否允许我使用存储在远程数据库“my_auth_db”中的用户登录到我的 Django 应用程序?
假设上述答案是肯定的,如果在我的本地数据库(应用程序“myapp”)中我的模型具有针对用户的外键,会发生什么情况?换句话说,我的模型 SomeModel 是在 myapp 中定义的,并且应该存在于 myapp_db 中,但它在 my_auth_db 中具有指向用户的外键:
class SomeModel(models.model):
user = models.ForeignKey(User, unique=False, null=False)
description = models.CharField(max_length=255, null=True)
dummy = models.CharField(max_length=32, null=True)
etc.
Run Code Online (Sandbox Code Playgroud)
第二个问题:这可能吗?或者一个数据库表根本不可能拥有另一个数据库中的表的外键?
如果我真的想完成这项工作,我可以将ForeignKey字段“user”替换为IntegerField“user_id”,然后如果我需要somemodel.user,我会改为获取somemodel.user_id并使用models.User.objects.get(pk =somemodel.user_id),路由器知道在哪里查询用户的 …
python django django-models multiple-databases django-database
django ×5
database ×2
foreign-keys ×2
mysql ×2
postgresql ×2
python ×2
django-orm ×1
innodb ×1
join ×1
sql ×1
sqlite ×1