虚拟外键
最后修改时间:2023 年 10 月 19 日在某些情况下,您不想使用显式定义的外键。不使用外键的原因可能包括性能问题(在 CRUD 操作中)、数据库特性(ClickHouse 和 Apache Cassandra 等数据库不支持外键)、临时表的使用(用于测试)、个人原因等。
在这种情况下,您仍然可以创建外键关系,而无需更改数据库代码。为此,请使用虚拟外键。虚拟外键是IDE虚拟对象。作为外键的替代方案,数据库代码中未定义虚拟键。
考虑以下示例查询:
SELECT * FROM activity JOIN visitor ON visitor_id = visitor.id
假设visitor_id
未在数据库中定义为外键。您仍然可以在这个 JOIN 子句中使用visitor_id
表中字段activity
与id
表中字段之间的这种虚拟关系visitor
。您可以保存此关系并在以后使用它,或者使用正则表达式在设置中配置虚拟外键的规则。
提示
如果您有指向另一个架构中的对象的外键,并且这些对象具有相同的名称,则它们将在外键导航对话框中显示为合格。
虚拟外键关系存储在external-data-<data_source_name>.xml中。您可以为 XML 文件选择另一个名称以及存储该文件的其他位置。要更改或查看 XML 文档的路径,请按 打开数据源设置,单击选项选项卡并查看虚拟对象和属性字段。ShiftEnter
虚拟外键可以在数据库工具窗口中看到 。您可以在数据库工具窗口主题的数据源及其元素章节中看到有关节点和对象图标的参考。
对于表列图标,请参阅列的可能图标组合。
创建虚拟外键
在 数据库工具窗口(视图|工具窗口| 数据库)中,展开数据源树直到表的节点。
右键单击表节点并选择新建| 虚拟外键。
在打开的“修改”对话框中,在“名称”字段中输入虚拟外键的名称。
在“目标表”窗格中,指定目标表的名称。
在“列”窗格中,单击“添加”按钮 ( )。
在“列名称”字段中,指定子表中的列的名称。
在“目标名称”字段中,指定目标表中的列的名称。
单击“确定”。
如果“保存 <data_source_name> 的外部数据”对话框打开,请指定external-data-<data_source_name>.xml文件的目录,然后单击“保存”。
单击 ON 子句中的表关系,然后按。AltEnter
选择存储表关系。
如果“保存 <data_source_name> 的外部数据”对话框打开,请指定external-data-<data_source_name>.xml文件的目录,然后单击“保存”。
为虚拟外键创建规则
您可以使用正则表达式创建规则,根据该规则,PyCharm 将一个表中的列指向另一个表中的列。
打开设置 ( ) 并导航至数据库| 其他。CtrlAlt0S
找到虚拟外键部分。
在表中,单击添加按钮 ( )。
双击“列模式”单元格,然后键入与要用作虚拟外键的列名称相匹配的正则表达式。
双击目标列模式单元格并输入替换模式。替换模式使用列模式表达式中的匹配,并被解释为正则表达式。
您可以使用“检查”按钮 ( ) 检查您的规则。当您选择规则并单击“检查”按钮时,将打开“规则调试器”对话框。您可以在“生成的模式”字段中看到结果。生成的模式字段中的结果表达式必须与所需的目标表.列模式匹配。
虚拟外键的调试规则
打开设置 ( ) 并导航至数据库| 其他。CtrlAlt0S
找到虚拟外键部分。
选择规则并单击检查按钮 ( )。
在规则调试器对话框中,填写以下字段:
列模式:与要用作虚拟外键的列名称匹配的正则表达式。
例如,要描述使用
_id
后缀的列,请使用(.*)_(?i)id
正则表达式。此正则表达式将查找类似visitor_id
or 的列visitor_Id
,并捕获visitors
为第一个捕获组 ($1
)。目标列模式:使用列模式表达式中的匹配项并被解释为正则表达式的替换模式。您可以在“生成的模式”字段中看到结果。请注意,仅当您在“源列”字段中提供列名称示例时,才会显示结果。
例如,我们可以使用从列模式
$1
表达式捕获的组 ( ) ,添加点 ( ) 和。该表达式将生成我们可以用作主键的引用。.
id
visitor.id
注意:目标列模式替换模式用于在生成模式字段中使用捕获的组生成正则表达式模式。确保对按字面翻译的符号进行双重转义,如示例表达式 (
$1\\.(?i)id
) 中的点。源列:要用作虚拟外键的列名称的示例。
生成的模式:生成的只读正则表达式模式,与目标 table.column名称匹配。生成的模式是由目标列模式中的替换模式生成的结果。
目标表.列:将用作源列中虚拟外键的主键的表和列名称的示例。
在代码补全中显示虚拟外键
PyCharm 可以为您生成 JOIN 语句的可能代码完成建议列表。代码完成列表包括其他表中与 JOIN 语句中表中的列同名的列的建议。
例如,假设该actor
表具有以下列:actor_id
、first_name
、last_name
、last_update
。在建议列表中,您将看到其他表中显示的这些列的名称的可能补全。
按打开设置并导航至编辑器| 一般| 代码完成。CtrlAlt0S
向下滚动到SQL部分,选择根据名称匹配建议非严格外键。
已选中复选框复选框已清除
感谢您的反馈意见!