虚拟外键
在某些情况下,您可能不希望使用显式定义的外键。 不使用外键的原因可能包括性能问题(在 CRUD 操作中)、数据库特性(诸如 ClickHouse 和 Apache Cassandra 等数据库不支持外键)、使用临时表(用于测试)、个人原因等。
在这种情况下,您仍然可以在不更改数据库代码的情况下创建外键关系。 为此,请使用 虚拟外键。 虚拟外键是 IDE 的虚拟对象。 与外键不同,虚拟外键不在数据库代码中定义。
请参考以下示例查询:
假设数据库中未将 visitor_id 定义为外键。 在此 JOIN 子句中,您仍然可以使用 activity 表中的 visitor_id 字段与 visitor 表中的 id 字段之间的虚拟关系。 您可以 保存此关系 ,以便稍后使用,或在设置中使用正则表达式为虚拟外键 配置规则。
虚拟外键关系存储在 external-data-<data_source_name>.xml 中。 您可以为该 XML 文件选择其他名称和存储位置。 要更改或查看 XML 文档的路径,请按 Shift+Enter 打开数据源设置,点击 选项 选项卡并查看 虚拟对象和特性 字段。
可在 数据库 工具窗口中找到虚拟外键()。

创建虚拟外键
在 数据库 工具窗口中,展开数据源树,直到表的节点。
右键点击该表节点并选择 。
在打开的 修改 对话框中,在 名称 字段中输入虚拟外键的名称。
在 目标表 窗格中,指定目标表的名称。
在 列 窗格中,点击 添加 按钮(
)。
在 列名 字段中,指定子表中列的名称。
在 目标名称 字段中,指定目标表中列的名称。
点击 确定 以添加虚拟外键。
如果 保存 <data_source_name> 的外部数据 对话框打开,请为 external-data-<data_source_name>.xml 文件指定目录,然后点击 保存。

点击
ON子句中的表关系,并按 Alt+Enter。选择 存储表关系。
如果 保存 <data_source_name> 的外部数据 对话框打开,请为 external-data-<data_source_name>.xml 文件指定目录,然后点击 保存。

为虚拟外键创建规则
您可以使用正则表达式创建一条规则,使 PyCharm 将一个表中的列指向另一个表中的列。
打开设置(Ctrl+Alt+S ),并导航到 。
找到 虚拟外键 部分。
在表中,点击 添加 按钮(
)。
双击 列模式 单元格,并输入可匹配您想用作虚拟外键的列名的正则表达式。
双击 目标列模式 单元格,并输入替换模式。 替换模式使用来自 列模式 表达式的匹配项,并被解释为正则表达式。
您可以使用 检查… 按钮(
)检查您的规则。 当您选择该规则并点击 检查… 按钮时,将打开 规则调试器 对话框。 您可以在 生成的模式 字段中看到结果。 在 生成的模式 字段生成的表达式必须与所需的 目标表.列 模式匹配。

调试虚拟外键规则
打开设置(Ctrl+Alt+S ),并导航到 。
找到 虚拟外键 部分。
选择该规则,然后点击 检查… 按钮(
)。
在 规则调试器 对话框中,填写以下字段:
列模式 :可匹配您想用作虚拟外键的列名的正则表达式。
例如,要描述使用
_id后缀的列,请使用(.*)_(?i)id正则表达式。 此正则表达式将找到类似visitor_id或visitor_Id的列,并将visitors捕获为第一个捕获组($1)。目标列模式 :使用 列模式 表达式的匹配项并被解释为正则表达式的替换模式。 您可以在 生成的模式 字段中看到结果。 请注意,仅当您在 源列 字段中给出列名示例时,结果才会出现。
例如,我们可以使用来自 列模式 表达式的捕获组(
$1),再加上一个点(.)以及id。 该表达式将生成visitor.id引用,我们可以将其用作主键。注意: 目标列模式 替换模式用于在 生成模式 字段中生成带有捕获组的正则表达式模式。 请确保对按字面量解释的符号进行双重转义,例如示例表达式中的点(
$1\\.(?i)id)。源列 :您想用作虚拟外键的列名示例。
生成的模式 :用于与 目标表.列 名称匹配的生成的只读正则表达式模式。 生成的模式 是由 目标列模式 中的替换模式生成的结果。
目标表.列 :将在 源列 中用作虚拟外键主键的表和列名示例。

在代码补全中显示虚拟外键
PyCharm 可以为 JOIN 语句生成可能的代码补全建议列表。 代码补全列表包括来自其他表的列建议,这些列与 JOIN 语句中该表的列同名。
例如,假设 actor 表具有以下列: actor_id、 first_name、 last_name、 last_update。 在建议列表中,您将看到来自其他表的、名称与这些列相同的可能补全项。
按 Ctrl+Alt+S 打开设置,并导航到 。
向下滚动到 SQL 部分,选择 根据名称匹配建议非严格外键。

