2014-03-06 72 views

回答

4

有一個PostgreSQL extension在PL/PgSQL中實現JSON模式驗證。

它這樣使用(從項目的README文件獲取):

CREATE TABLE example (id serial PRIMARY KEY, data jsonb); 
ALTER TABLE example ADD CONSTRAINT data_is_valid CHECK (validate_json_schema('{"type": "object"}', data)); 

INSERT INTO example (data) VALUES ('{}'); 
-- INSERT 0 1 

INSERT INTO example (data) VALUES ('1'); 
-- ERROR: new row for relation "example" violates check constraint "data_is_valid" 
-- DETAIL: Failing row contains (2, 1). 
+0

您是否知道是否有任何性能負載測試用於此驗證? – khorvat

+0

我不知道。該代碼非常簡短(259行),是一個非常直接的PL/PgSQL,可以解釋。你應該用你自己的模式來衡量它。 – Mordae

3

你需要的是東西JSON模式約束轉化爲PostgreSQL的那些,例如:

{ 
    "properties": { 
     "age": {"minimum": 21} 
    }, 
    "required": ["age"] 
} 

到:

SELECT FROM ... 
WHERE (elem->>'age' >= 21) 

我不知道任何現有的工具。我知道MySQL類似的東西可能對編寫自己的東西有用,但對於在PostgreSQL中使用JSON類型沒有用處。

+0

我認爲現在還沒有可用的模式驗證,您知道我們是否有機會使用V8引擎進行驗證,例如:在一些OnUpdate/OnInsert操作? – khorvat

+0

哦!對不起,我誤解了,並且以爲你問的是使用JSON Schema進行查詢,而不是驗證。是的,驗證作爲一個鉤子,甚至在您提交之前在代碼中驗證似乎是合理的。 – cloudfeet

+2

查看此資源。可能會有所幫助。 http://blog.endpoint.com/2013/06/postgresql-as-nosql-with-data-validation.html – topwik

1

還有一個PostgreSQL extension實現JSON驗證。用法是幾乎相同「的Postgres,JSON-模式」

CREATE TABLE example (id serial PRIMARY KEY, data jsonb); 
-- do is_jsonb_valid instead of validate_json_schema 
ALTER TABLE example ADD CONSTRAINT data_is_valid CHECK (is_jsonb_valid('{"type": "object"}', data)); 

INSERT INTO example (data) VALUES ('{}'); 
-- INSERT 0 1 

INSERT INTO example (data) VALUES ('1'); 
-- ERROR: new row for relation "example" violates check constraint "data_is_valid" 
-- DETAIL: Failing row contains (2, 1). 

我做了一些基準測試驗證的鳴叫,這是超過20倍「的Postgres,JSON-模式」更快,主要是因爲它是用C而不是SQL。

免責聲明,我已經寫了這個擴展名。