如何使外部数据库对视图可用?


8

在这里和其他地方,有关在Drupal中使用外部数据库的讨论很多。我从中发现的是:

  • 处理数据库表中数据的最佳方法是使用“视图”模块。我已经安装并开始使用它,发现它非常适合处理我添加到站点数据库中的表。
  • 使视图与不是由Drupal创建的表一起使用的简单方法是使用数据模块。该模块将站点数据库中任何未被Drupal使用的表都视为“孤立表”,并允许在单击按钮时“采用”该表。
  • 显然,“表向导”模块提供了一种处理不在站点数据库中的表的方法。但是该模块不适用于Drupal 7。
  • “数据库设置”部分中的“ settings.php”文件包含有关如何定义该站点可以使用的其他数据库的详细文档。但是,以这种方式定义数据库时,其表不会显示在“数据”模块中的孤立表列表中。

我对其中一个站点的“ settings.php”文件中的数据库定义所做的更改是:

$databases = array ( 'default' => array ('default' => array ( 'database' => 'db_local', 'username' => 'db_local', 'password' => '_________', 'host' => 'localhost', 'port' => '', 'driver' => 'mysql', 'prefix' => '', ), ), 'extra' => array ('default' => array ( 'database' => 'db__extra', 'username' => 'db_admin', 'password' => '_________, 'host' => 'localhost', 'port' => '', 'driver' => 'mysql', 'prefix' => '', ), ), );

我有一个表,我想在多站点安装中的多个站点中使用。这意味着我需要将该表放在每个站点都可以访问的数据库中。根据我已完成的阅读,我的选择是:

  1. 最好,如果可能的话:发现有一种方法可以使“数据”模块识别“ settings.php”中定义的附加数据库中的表,以便可以采用它们。
  2. 使用表前缀可以允许所有站点使用一个数据库。
  3. Forena Reports ” 模块似乎完全可以满足我的需求,但是在安装后,我却无法正常工作。我提交了问题2475645,除非有解决该问题的方法,否则在那里别无他法
  4. 编写我自己的模块,以使Views可以访问“ settings.php”中定义的其他数据库。
  5. 使用表向导安装Drupal 6,并使用它获取视图以查看我的外部表,然后以某种方式将其结果放入Drupal 7中。(在某些帖子中已建议这样做)。
  6. 请遵循https://drupal.stackexchange.com/a/3321/45991中的过程,该过程从安装补丁开始,似乎还需要创建我自己的模块。
  7. 我还查看了Feed,Feed SQL,Views XML Backend和Migrate模块,但是它们都没有说它们可以将外部数据库连接到Views。我想念什么吗?其中之一是正确的解决方案吗?

选项2不切实际,因为这将导致拥有数百个表的庞大数据库,而这将非常难以管理。我在开始使用Drupal方面一直取得很大的进步,但是我不适应4、5或6的任务。选项1是否有可能起作用?还是有其他方法可以使Views与站点数据库外部的表一起使用而又无法编写自己的模块?

另外两个细节:我需要使用的第一个表非常大,超过6,000行,约20列。除了从数据库中获取的页面内容信息外,无意使站点的访问者可以访问数据库。

谢谢你的帮助。

Answers:


2

我认为Forena模块确实可以完全满足您的需求。我认为您的设置问题只是一个支持请求,而不是需要“修复”的问题。解决该问题后,您甚至可以选择是或否使用其视图集成。

您创建的Forena问题已得到充分记录(出色的工作!)。但是,没有任何地方能说明您授予的权限(这使我相信您可能缺少某些必需的权限)。因此,这里尝试解决此问题:

  • 您能否简要说明一下您授予了哪些(必需的)Forena相关权限?

  • 所需的Forena权限在Forena随附的《安装指南》中进行了说明。仅供参考:这是它(一部分)的报价:

    通过使用标准的Drupal管理工具为角色授予权限,Forena在报告相关授权方面具有很多粒度。最初可以授予的与Forena相关的Drupal权限列表可能有点让人不知所措。因为每个定义的数据源都有3个条目,所以Vanilla Forena已经提供了3个数据源。

    要在您自己的站点中检索此指南,只需导航至/reports/help.setup

这些访问“数据”的权限最初被保留。这是设计使然,因为Forena对与通过Forena授予对数据的访问权限相关的任何事情也非常敏感。您不希望发生的事情是,只需安装和配置Forena(无需管理员权限),您就可以将其用作访问安全数据的解决方法。

还要注意,除了整个数据源级别的权限之外,您还可以选择进一步优化特定数据块的所需权限(=自定义SQL查询)。为此,只需在SQL语句中指定所需的(Drupal)权限(语法详细信息包含在Forena指南中)。一个典型的用例是确保访问其中包含敏感数据的列。

披露:我是该模块的共同维护者,
希望这不会违反该网站的自我推广政策


这次真是万分感谢。当我第一次进行安装时,我没有注意到有五个权限没有授予任何人。我现在将它们授予管理员(即我)。设置文档没有说明为什么原先保留这些权限以及是否有理由不将其授予管理员。但是,我现在有了这些数据源,因此已经解决了该问题。您是在这里而不是在我提交的问题中做出回应的原因吗?
NewSites

很高兴阅读进度!仅供参考:我现在也通过问题队列进行了回复。因此,既然“这已经解决了问题”,是否意味着您将Forena确实视为对问题的“答案”(还不如OP的项目3所示)?仅供参考:我将在此处尝试更新我的答案,以简要说明“为什么原来保留这些权限”,这是一个很好的额外问题!
Pierre.Vriens,2015年

我不是拒绝您回答的人。现在,我已经接受您的答案作为<u> </ u>并对其进行了投票(不幸的是,该答案只能将其返回零)。
NewSites 2015年

嗯,我不是假设@NewSites投票了,实际上我已经学会了接受投票。我个人不喜欢总体上的否决权,在没有任何评论可以解释它们的地方,我会忽略其中的任何一个。但是,当然非常感谢“赞成”和“接受”。当然,知道还有另一个Drupal用户似乎现在已经发现了Forena,该走的路!确保在适当的地方提出(支持?)问题(以查看工作中的支持...)。
Pierre.Vriens,2015年

2

我已经通过两种不同的方式成功完成了此操作:

使用SQL视图在其中创建虚拟表,db_local该虚拟表引用中的相应表db__extra创建的查询如下所示:

USE db_local; CREATE VIEW some_table AS SELECT * FROM db__extra.some_table;

然后,您可以引用此SQL视图,就好像它是Drupal数据库中的本机表一样,甚至根本不需要在settings.php中添加外部数据库。请注意,这可能与Data模块不兼容(请参阅https://www.drupal.org/node/1973806),但是您应该能够通过实现来向Drupal Views模块描述SQL视图hook_views_data(),并停止使用Data模块。

这是另一种可能性:使用选择性表前缀诱使Drupal将{some_table}重写为db__extra.some_table。这与为Drupal表添加前缀不同。

您的$databases设置如下所示:

$databases = array ( 'default' => array ('default' => array ( 'database' => 'db_local', 'username' => 'db_local', 'password' => '_________', 'host' => 'localhost', 'port' => '', 'driver' => 'mysql', 'prefix' => array( 'some_table' => 'db__extra.', ), )) );

同样,我不确定它是否与数据模块兼容,因为我不使用它。但是,如果您实现hook_views_data()自己的话,它将与Views一起使用。


您在两种方法中都说我需要实现<code> hook_views_data()</ code>。不需要编写模块吗?无论如何,我在第二种方法中尝试了数据库定义。它并没有导致“ db_extra”中的表出现在数据模块的孤立表列表中。在您的第一种方法中,如何将您建议的查询放在哪里(如果不在自定义模块中)?
NewSites 2015年

如果要创建SQL视图,则需要直接在MySQL中运行一次CREATE VIEW查询。不需要重新运行。
Lis Lim 2015年

对不起,我还是听不懂。您希望我在哪里运行此查询?在phpMyAdmin中?这会给我一些可以在Views中使用的东西吗?我在Drupal.org上搜索了“ SQL视图”,并得到了drupal.org/project/sql_views,该文件没有产品下载,并且其在drupal.org/node/2458947上的文档说我需要实现一个钩子(我认为这意味着编写)一个模块)告诉Views模块有关我的SQL视图的信息。因此,这听起来像是您的建议要求编写一个模块(我只是觉得自己还没有准备好),如果没有,我只是不明白您要我做什么。
NewSites 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.