- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
TLTR: Django 没有在 SQL 查询中包含数据库名称,我可以强制它这样做还是有解决方法?
长版:
我有两个 旧版 MySQL 数据库(注意:我对数据库布局没有影响),我正在为其创建一个只读 API 在 Django 1.11 和 python 3.6 上使用 DRF
我正在使用此处建议的 SpanningForeignKey 字段解决 MyISAM 数据库的引用完整性限制:https://stackoverflow.com/a/32078727/7933618
我正在尝试通过 DB1 上的多对多表将 DB1 中的表连接到 DB2 中的表。这就是 Django 正在创建的查询:
SELECT "table_b"."id" FROM "table_b" INNER JOIN "throughtable" ON ("table_b"."id" = "throughtable"."b_id") WHERE "throughtable"."b_id" = 12345
这当然会给我一个错误“表 'DB2.throughtable' 不存在”,因为 throughtable 在 DB1 上,我不知道如何强制 Django 在表前加上 DB 名称。查询应该是:
SELECT table_b.id FROM DB2.table_b INNER JOIN DB1.throughtable ON (table_b.id = throughtable.b_id) WHERE throughtable.b_id = 12345
app1 db1_app/models.py
的模型:(DB1)
class TableA(models.Model):
id = models.AutoField(primary_key=True)
# some other fields
relations = models.ManyToManyField(TableB, through='Throughtable')
class Throughtable(models.Model):
id = models.AutoField(primary_key=True)
a_id = models.ForeignKey(TableA, to_field='id')
b_id = SpanningForeignKey(TableB, db_constraint=False, to_field='id')
app2 db2_app/models.py
的模型:(DB2)
class TableB(models.Model):
id = models.AutoField(primary_key=True)
# some other fields
数据库路由器:
def db_for_read(self, model, **hints):
if model._meta.app_label == 'db1_app':
return 'DB1'
if model._meta.app_label == 'db2_app':
return 'DB2'
return None
我可以强制 Django 在查询中包含数据库名称吗?或者有什么解决方法吗?
最佳答案
Django 1.6+(包括 1.11)的解决方案适用于 MySQL 和 sqlite 后端,通过选项 ForeignKey.db_constraint=False和明确的 Meta.db_table
。如果数据库名和表名被 ' ' (对于 MySQL)或 ' "'(对于其他 db)引用,例如 db_table = '"db2"."table2"'
)。然后不多引用,点不引用。有效查询由Django ORM编译。更好的类似解决方案是db_table = 'db2"."table2'
(这不仅允许连接,而且还允许跨数据库约束迁移更接近一个问题)
db2_name = settings.DATABASES['db2']['NAME']
class Table1(models.Model):
fk = models.ForeignKey('Table2', on_delete=models.DO_NOTHING, db_constraint=False)
class Table2(models.Model):
name = models.CharField(max_length=10)
....
class Meta:
db_table = '`%s`.`table2`' % db2_name # for MySQL
# db_table = '"db2"."table2"' # for all other backends
managed = False
查询集:
>>> qs = Table2.objects.all()
>>> str(qs.query)
'SELECT "DB2"."table2"."id" FROM DB2"."table2"'
>>> qs = Table1.objects.filter(fk__name='B')
>>> str(qs.query)
SELECT "app_table1"."id"
FROM "app_table1"
INNER JOIN "db2"."app_table2" ON ( "app_table1"."fk_id" = "db2"."app_table2"."id" )
WHERE "db2"."app_table2"."b" = 'B'
Django 中的所有数据库后端都支持查询解析,但是其他必要的步骤必须由后端单独讨论。我试图更笼统地回答,因为我找到了 similar important question .
迁移需要选项“db_constraint”,因为 Django 无法创建引用完整性约束添加外键table1(fk_id) REFERENCES db2.table2(id)
,
但它can be created manually用于 MySQL。
对于特定后端的一个问题是,是否可以在运行时将另一个数据库连接到默认数据库,以及是否支持跨数据库外键。这些模型也是可写的。间接连接的数据库应该作为遗留数据库使用 managed=False
(因为只有一个表 django_migrations
用于迁移跟踪仅在直接连接的数据库中创建。该表应该仅描述同一数据库中的表。)但是,如果数据库系统支持此类索引,则可以在托管端自动创建外键索引。
Sqlite3:它必须在运行时附加到另一个默认的 sqlite3 数据库(答案 SQLite - How do you join tables from different databases ),最多通过信号 connection_created :
from django.db.backends.signals import connection_created
def signal_handler(sender, connection, **kwargs):
if connection.alias == 'default' and connection.vendor == 'sqlite':
cur = connection.cursor()
cur.execute("attach '%s' as db2" % db2_name)
# cur.execute("PRAGMA foreign_keys = ON") # optional
connection_created.connect(signal_handler)
那么它当然不需要数据库路由器,普通的django...ForeignKey
可以与db_constraint=False 一起使用。一个优点是,如果数据库之间的表名是唯一的,则不需要“db_table”。
在 MySQL foreign keys between different databases很容易。 SELECT、INSERT、DELETE 等所有命令都支持任何数据库名称,而无需事先附加它们。
这个问题是关于遗留数据库的。然而,我在迁移方面也有一些有趣的结果。
关于python - Django ManyToMany 通过多个数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45018277/
我的问题是如何在 python 中创建一个简单的数据库。我的例子是: User = { 'Name' : {'Firstname', 'Lastname'}, 'Address' : {'Street
我需要创建一个与远程数据库链接的应用程序! mysql 是最好的解决方案吗? Sqlite 是唯一的本地解决方案吗? 我使用下面的方法,我想知道它是否是最好的方法! NSString *evento
给定两台 MySQL 服务器,一台本地,一台远程。两者都有一个包含表 bohica 的数据库 foobar。本地服务器定义了用户 'myadmin'@'%' 和 'myadmin'@'localhos
我有以下灵活的搜索查询 Select {vt:code},{vt:productcode},{vw:code},{vw:productcode} from {abcd AS vt JOIN wxyz
好吧,我的电脑开始运行有点缓慢,所以我重置了 Windows,保留了我的文件。因为我的大脑还没有打开,所以我忘记事先备份我的 MySQL 数据库。我仍然拥有所有原始文件,因此我实际上仍然拥有数据库,但
如何将我的 Access 数据库 (.accdb) 转换为 SQLite 数据库 (.sqlite)? 请,任何帮助将不胜感激。 最佳答案 1)如果要转换 db 的结构,则应使用任何 DB 建模工具:
系统检查发现了一些问题: 警告:?:(mysql.W002)未为数据库连接“默认”设置 MySQL 严格模式 提示:MySQL 的严格模式通过将警告升级为错误来修复 MySQL 中的许多数据完整性问题
系统检查发现了一些问题: 警告:?:(mysql.W002)未为数据库连接“默认”设置 MySQL 严格模式 提示:MySQL 的严格模式通过将警告升级为错误来修复 MySQL 中的许多数据完整性问题
我想在相同的 phonegap 应用程序中使用 android 数据库。 更多说明: 我创建了 phonegap 应用程序,但 phonegap 应用程序不支持服务,所以我们已经在 java 中为 a
Time Tracker function clock() { var mytime = new Date(); var seconds
我需要在现有项目上实现一些事件的显示。我无法更改数据库结构。 在我的 Controller 中,我(从 ajax 请求)传递了一个时间戳,并且我需要显示之前的 8 个事件。因此,如果时间戳是(转换后)
我有一个可以收集和显示各种测量值的产品(不会详细介绍)。正如人们所期望的那样,显示部分是一个数据库+建立在其之上的网站(使用 Symfony)。 但是,我们可能还会创建一个 API 来向第三方公开数据
我们将 SQL Server 从 Azure VM 迁移到 Azure SQL 数据库。 Azure VM 为 DS2_V2、2 核、7GB RAM、最大 6400 IOPS Azure SQL 数据
我正在开发一个使用 MongoDB 数据库的程序,但我想问在通过 Java 执行 SQL 时是否可以使用内部数据库进行测试,例如 H2? 最佳答案 你可以尝试使用Testcontainers Test
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 已关闭 9 年前。 此问题似乎与 a specific programming problem, a sof
我正在尝试使用 MSI 身份验证(无需用户名和密码)从 Azure 机器学习服务连接 Azure SQL 数据库。 我正在尝试在 Azure 机器学习服务上建立机器学习模型,目的是我需要数据,这就是我
我在我的 MySQL 数据库中使用这个查询来查找 my_column 不为空的所有行: SELECT * FROM my_table WHERE my_column != ""; 不幸的是,许多行在
我有那个基地:http://sqlfiddle.com/#!2/e5a24/2这是 WordPress 默认模式的简写。我已经删除了该示例不需要的字段。 如您所见,我的结果是“类别 1”的两倍。我喜欢
我有一张这样的 table : mysql> select * from users; +--------+----------+------------+-----------+ | userid
我有表: CREATE TABLE IF NOT EXISTS `category` ( `id` int(11) NOT NULL, `name` varchar(255) NOT NULL
我是一名优秀的程序员,十分优秀!