【问题标题】:Django model reference to a postgres foreign table (clickhouse_fdw)Django 模型对 postgres 外部表的引用 (clickhouse_fdw)
【发布时间】:2019-11-22 11:58:40
【问题描述】:

我有一个 Django 项目。我已经使用 clickhouse_fdw 将 clickhouse 表与 postgres 表连接起来。 按照 clickhouse_fdw 的说明,我在 postgres 中做了:

CREATE EXTENSION clickhousedb_fdw;
CREATE SERVER clickhouse_svr FOREIGN DATA WRAPPER clickhousedb_fdw OPTIONS(host 'host', dbname 'dbname', driver '/var/lib/postgresql/libclickhouseodbc.so');
CREATE USER MAPPING FOR CURRENT_USER SERVER clickhouse_svr;
CREATE FOREIGN TABLE clickhouse_table ("date_from" Date, "date_to" Date ... ) server clickhouse_svr options(table_name 'table');

它正在使用 psql 命令工作,但现在我想从 django 访问(我可以毫无问题地访问所有其他表)。 我为 clickhouse 表添加了一个新模型,并在 django 中忽略了它的迁移和管理。

然后在 django shell 中我试过了:

ClickHouseTable.objects.all()
ClickHouseTable.objects.raw('SELECT * FROM clickhouse_table LIMIT 1')[0]
from django.db import connection
with connection.cursor() as cursor:
    cursor.execute('SELECT * FROM clickhouse_table LIMIT 1')
    row = cursor.fetchone()

我得到的每一个查询:

ProgrammingError: permission denied for foreign table clickhouse_table

同样来自 dbshel​​l:

database => SELECT * FROM clickhouse_table LIMIT 1;
ERROR:  permission denied for foreign table clickhouse_table

有什么建议吗?

【问题讨论】:

    标签: django postgresql clickhouse foreign-data-wrapper postgres-fdw


    【解决方案1】:

    您的 Django 应用需要完全访问数据库。此外,Django 为您提供 ORM。你可以考虑使用它。

    【讨论】:

    • 是的!那是我第一次做的。我也尝试过使用 django orm,像 ClickHouseTable.objects.all() 这样的东西以同样的错误结束。
    • 我从未将 Django 与 Postgres 一起使用。但是这个错误来自 Postgres。看来您没有授予 Django 应用程序权限。尝试遵循这样的教程:medium.com/agatha-codes/painless-postgresql-django-d4f03364989
    • 但是我可以使用 Django 访问所有表。问题在于这个外部数据包装器。我也做了 GRANT USAGE ON FOREIGN SERVER myserver TO myuser;
    • 酷,我很确定您的应用由于某种原因没有被授予所有权限...
    【解决方案2】:

    我从头开始,现在可以正常工作了。不知道发生了什么:/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-31
      • 1970-01-01
      • 2016-11-01
      • 2019-03-09
      • 2019-05-31
      相关资源
      最近更新 更多