比如:当前数据库服务中有两个库,我要关联这两个库中的表,django要怎么写?看了很久的源码,原来很简单
首先,我们在settings.py默认连接是“a”库:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'a', #默认连接a库
'HOST': '127.0.0.1',
'PORT': 3306,
'USER': 'root',
'PASSWORD': '',
}
}
然后,在models这样定义这两个表:
class User(models.Model):
id = models.BigAutoField(primary_key=True)
name = models.CharField(unique=True, max_length=100)
class Meta:
db_table = 'user' #user在a库,不用写库名
class Sex(models.Model):
id = models.BigAutoField(primary_key=True)
name = models.ForeignKey(User, to_field='name', db_column='name', on_delete=models.DO_NOTHING)
sex = models.CharField(unique=True, max_length=100)
class Meta:
managed = False
db_table = '`b`.`sex`' #sex在b库,这里要携带库名。一定要是:`库名`.`表名`
最后,这样关联查询:
models.Sex.objects.values('id', 'name_id', 'name__id', 'sex')
输出的SQL应该是这样的:
SELECT `user`.`id`, `b`.`sex`.`sex`, `b`.`sex`.`name`, `b`.`sex`.`id` FROM `b`.`sex` INNER JOIN `user` ON (`b`.`sex`.`name` = `user`.`name`);
源码逻辑如下(django.db.backends.mysql.operations:135)
def quote_name(self, name):
if name.startswith("`") and name.endswith("`"):
return name # Quoting once is enough.
return "`%s`" % name