如何让我的应用程序将列添加到 PostgreSQL 视图
How to make my application add column to a PostgreSQL view
我需要为我的应用程序找到一种向 PostgreSQL 视图添加列的方法。这需要动态完成,所以我不能对我的视图进行硬编码,而是我需要通过一些疯狂的 select 或类似的东西来获取它的实际代码。
我想通过调用一个 PostgreSQL 过程来实现这一点,该过程获取视图的创建脚本,删除它,然后使用新列重新创建它。问题是,我不知道如何获取视图的创建脚本。
我该怎么做,或者有其他方法可以做到吗?
我的应用程序使用 PHP 和 Zend Framework 2,我使用的是 Postgres 数据库。
编辑 1:我通过将原始 CREATE VIEW 脚本存储到一个变量中解决了我的问题,然后我循环到附加列中将它们添加到脚本中。
PostgreSQL 不存储视图的 "actual code"。也就是说,PostgreSQL 不存储 create view
语句。
您可以使用 create or replace view ...
在末尾添加列。但是您要么必须已经拥有列及其顺序,要么必须在 information_schema views or in the PostgreSQL system catalogs.
中查找所有信息
要替换视图,您必须是所有者,或者您必须是所有者角色的成员。
正如 pozs 指出的那样,有一组 pg_get_viewdef() 函数。他们没有 return 原始 create view
声明,但我非常有信心关键信息——列的名称和顺序——将允许您添加列 "at the end"。
这是我根据我的日历 table.
写给 运行 的实际 create view...
声明
create view weekdays as
select cal_date, day_of_week
from calendar
where day_of_week in ('Mon', 'Tue', 'Wed', 'Thu', 'Fri');
这是我使用 pg_get_viewdef() 的方式。
select pg_get_viewdef(to_regclass('weekdays'));
这就是它return编辑的内容。
SELECT calendar.cal_date,
calendar.day_of_week
FROM calendar
WHERE (calendar.day_of_week = ANY (ARRAY['Mon'::bpchar, 'Tue'::bpchar, 'Wed'::bpchar, 'Thu'::bpchar, 'Fri'::bpchar]));
我需要为我的应用程序找到一种向 PostgreSQL 视图添加列的方法。这需要动态完成,所以我不能对我的视图进行硬编码,而是我需要通过一些疯狂的 select 或类似的东西来获取它的实际代码。
我想通过调用一个 PostgreSQL 过程来实现这一点,该过程获取视图的创建脚本,删除它,然后使用新列重新创建它。问题是,我不知道如何获取视图的创建脚本。
我该怎么做,或者有其他方法可以做到吗?
我的应用程序使用 PHP 和 Zend Framework 2,我使用的是 Postgres 数据库。
编辑 1:我通过将原始 CREATE VIEW 脚本存储到一个变量中解决了我的问题,然后我循环到附加列中将它们添加到脚本中。
PostgreSQL 不存储视图的 "actual code"。也就是说,PostgreSQL 不存储 create view
语句。
您可以使用 create or replace view ...
在末尾添加列。但是您要么必须已经拥有列及其顺序,要么必须在 information_schema views or in the PostgreSQL system catalogs.
要替换视图,您必须是所有者,或者您必须是所有者角色的成员。
正如 pozs 指出的那样,有一组 pg_get_viewdef() 函数。他们没有 return 原始 create view
声明,但我非常有信心关键信息——列的名称和顺序——将允许您添加列 "at the end"。
这是我根据我的日历 table.
写给 运行 的实际create view...
声明
create view weekdays as
select cal_date, day_of_week
from calendar
where day_of_week in ('Mon', 'Tue', 'Wed', 'Thu', 'Fri');
这是我使用 pg_get_viewdef() 的方式。
select pg_get_viewdef(to_regclass('weekdays'));
这就是它return编辑的内容。
SELECT calendar.cal_date, calendar.day_of_week FROM calendar WHERE (calendar.day_of_week = ANY (ARRAY['Mon'::bpchar, 'Tue'::bpchar, 'Wed'::bpchar, 'Thu'::bpchar, 'Fri'::bpchar]));