Gor*_*oro 4 sql django postgresql database-connection postgresql-9.2
我的数据库基于客户端分成模式(即:每个客户端都有自己的模式,具有相同的数据结构).
我也碰巧有一个外部动作,不知道它应该针对哪个架构.它来自系统的另一部分,它没有客户端的概念,也不知道它在哪个客户端设置中运行.在我处理它之前,我必须找出请求需要定位的模式
为了找到正确的模式,我必须找出哪个包含R
特定唯一ID 的记录(字符串)
从我的理解,以下
SET search_path TO schema1,schema2,schema3,...
Run Code Online (Sandbox Code Playgroud)
将只查看schema1中的表(或与表匹配的第一个模式),并且不会进行全局搜索.
有没有办法让我在所有模式中进行全局搜索,或者我只需要使用for循环并迭代所有模式,一次一个?
考虑这个小小的演示:
CREATE SCHEMA master; -- no access of others ..
CREATE SEQUENCE master.myseq; -- global sequence to have globally unique id
CREATE table master.tbl (
id int primary key DEFAULT nextval('master.myseq')
, foo text);
CREATE SCHEMA x;
CREATE table x.tbl() INHERITS (master.tbl);
INSERT INTO x.tbl(foo) VALUES ('x');
CREATE SCHEMA y;
CREATE table y.tbl() INHERITS (master.tbl);
INSERT INTO y.tbl(foo) VALUES ('y');
SELECT * FROM x.tbl; -- returns 'x'
SELECT * FROM y.tbl; -- returns 'y'
SELECT * FROM master.tbl; -- returns 'x' and 'y' <-- !!
-- clean it all up:
-- DROP SCHEMA x, y, master CASCADE;
Run Code Online (Sandbox Code Playgroud)
现在,要实际识别特定行所在的表,请使用tableoid
:
SELECT *, tableoid::regclass AS table_name
FROM master.tbl
WHERE id = 2;
Run Code Online (Sandbox Code Playgroud)
结果:
id | foo | table_name
---+-----+-----------
2 | y | y.tbl
Run Code Online (Sandbox Code Playgroud)
您可以tableoid
通过tableoid
直接查询系统目录来从中获取源模式.(显示的名称取决于设置search_path
.)
SELECT n.nspname
FROM master.tbl t
JOIN pg_class c ON c.oid = t.tableoid
JOIN pg_namespace n ON c.relnamespace = n.oid
WHERE t.id = 2;
Run Code Online (Sandbox Code Playgroud)
这也是很多不是通过许多不同的表循环更快.
归档时间: |
|
查看次数: |
674 次 |
最近记录: |