2 回答

TA貢獻1828條經(jīng)驗 獲得超6個贊
這是最奇怪的事情。我已經(jīng)從另一個工具中復(fù)制了我的查詢文本,該工具用于在我的 pg DB 中導航到 VS Code 中。@EOhm 回答的最后一部分讓我想到了在 VS Code 中輸入整個內(nèi)容而不是復(fù)制/粘貼。
一切正常。
即使粘貼的文本和我輸入的內(nèi)容在各個方面看起來都相同。所以顯然有一些不可見的格式導致了這個問題。

TA貢獻1804條經(jīng)驗 獲得超7個贊
我不知道 SQLAlchemy 是否支持 MView-Creation,但它是否應(yīng)該與特定的元數(shù)據(jù)函數(shù)(https://docs.sqlalchemy.org/en/13/core/schema.html)相似或完成。
text 函數(shù)是為數(shù)據(jù)庫獨立的 DML 而設(shè)計的,而不是 DDL。也許它適用于 DDL(我不了解 SQLAlchemy),但根據(jù)設(shè)計,語法與您直接在數(shù)據(jù)庫上執(zhí)行時的語法不同,因為 SQLAlchemy 將從用戶那里抽象出數(shù)據(jù)庫的詳細信息。
如果 SQLAlchemy 沒有為此提供一些方便的方法,并且您仍然有充分的理由使用 SQLAlchemy,您可以在數(shù)據(jù)庫后端理解的方言中執(zhí)行普通 SQL Statememt,因此只需省略textSQL 語句的 sqlalchemies 函數(shù),例如:
from sqlalchemy import create_engine, text
sql = '''CREATE MATERIALIZED VIEW schema.view1 AS
SELECT t1.a,
t1.b,
t1.c
t2.x AS d
FROM schema.t1 t1
LEFT JOIN schema.t2 t2 ON t1.f = t2.f
UNION ALL
SELECT t3.a,
t3.b,
t3.c,
t3.d
FROM schema.t3 t3;'''
con=create_engine(db_conn)
con.raw_connection().cursor().execute(sql)
(但當然,您必須注意后端類型,然后反對 SQLAlchemy 包裝語句。)
我直接使用 psycopg2 在我的 pg 服務(wù)器上進行了測試,沒有任何問題。
postgres=# create schema schema;
CREATE TABLE
postgres=# create table schema.t1 (a varchar, b varchar, c varchar, f integer);
CREATE TABLE
postgres=# create table schema.t2 (x varchar, f integer);
CREATE TABLE
postgres=# create table schema.t3 (a varchar, b varchar, c varchar, d varchar);
CREATE TABLE
postgres=# commit;
使用以下腳本:
#!/usr/bin/python3
import psycopg2;
conn = psycopg2.connect("dbname=postgres")
cur = conn.cursor()
cur.execute("""
CREATE MATERIALIZED VIEW schema.view1 AS
SELECT t1.a,
t1.b,
t1.c,
t2.x AS d
FROM schema.t1 t1
LEFT JOIN schema.t2 t2 ON t1.f = t2.f
UNION ALL
SELECT t3.a,
t3.b,
t3.c,
t3.d
FROM schema.t3 t3;
""")
conn.commit()
cur.close()
conn.close()
我用最新版本的 python3.7/2.7 和當前版本的 psycopg2 模塊和當前庫(我有 11.5 pg 客戶端和 2.8.3 psycopg2)從安裝在最近的 linux 上的 pgdg 進行測試?你能像我一樣嘗試直接在 psycopg2 上執(zhí)行嗎?
您是否還確保您的點是普通的 ascii 點,因為聲明中的所有其他字符都在這種情況下?(還請記住,unicode 中可能存在不可見的代碼點,這可能會導致此類問題。)如果您使用的是 Python,也許您可以將您的字符串轉(zhuǎn)換為 ASCII 二進制文件,然后再轉(zhuǎn)換回 Unicode-String。如果它沒有引發(fā)錯誤,.encode('ASCII')它應(yīng)該是干凈的。
添加回答
舉報