2016-09-01 29 views
0

我正在嘗試使用Leaflet和CartoDB創建一個Web應用程序。我正在嘗試使用this tutorial來讀取和寫入公共CartoDB表中的數據。如何使用Leaflet.draw和CartoDB更新/插入表格

本教程解釋瞭如何使用安全性定義器來完成此操作。無論出於何種原因,我在應用程序中使用leaflet.draw創建的功能都沒有插入到我的表中。我仍然對編碼不熟悉,並且不確定在我的代碼中如何實際調用SQL查詢,但我已經嘗試複製示例源代碼並且沒有任何執行的運氣。

目標是允許用戶在地圖上創建和編輯它們的點並將這些點保存到CartoDB中的衆包數據庫中。

爲我的項目的代碼可以在這裏看到:https://github.com/zrobby/crowdsource-storymap

說我有如下所示執行難度和來自上面鏈接的教程中的特定SQL查詢。

DROP FUNCTION IF EXISTS leaflet_upsert_usercomments(int[], text[]); 

    -- Returns a set of op,cartodb_id values where op means: 
    -- deleted: -1 
    -- updated: 0 
    -- inserted: 1 

    CREATE OR REPLACE FUNCTION leaflet_upsert_usercomments(
    cartodb_ids integer[], 
    geojsons text[]) 
    RETURNS TABLE(op int, cartodb_id int) 

    LANGUAGE plpgsql SECURITY DEFINER 
    RETURNS NULL ON NULL INPUT 
    AS $$ 
    DECLARE 
    sql text; 
    BEGIN 

    sql := 'WITH n(cartodb_id,the_geom) AS (VALUES '; 

    -- Iterate over the values 
    FOR i in 1 .. array_upper(geojsons, 1) 
    LOOP 
    IF i > 1 THEN sql := sql || ','; END IF; 
    sql :=sql || '('||cartodb_ids[i]||',' 
      || 'ST_SetSRID(ST_GeomFromGeoJSON(NULLIF('''|| geojsons[i] ||''','''')),4326))'; 
    END LOOP; 

    sql := sql || '), do_update AS (' 
     || 'UPDATE leaflet_data p ' 
     || 'SET the_geom=n.the_geom FROM n WHERE p.cartodb_id = n.cartodb_id ' 
     || 'AND n.the_geom IS NOT NULL ' 
     || 'RETURNING p.cartodb_id), do_delete AS (' 
     || 'DELETE FROM leaflet_data p WHERE p.cartodb_id IN (' 
     || 'SELECT n.cartodb_id FROM n WHERE cartodb_id >= 0 AND ' 
     || ' n.the_geom IS NULL) RETURNING p.cartodb_id), do_insert AS (' 
     || 'INSERT INTO leaflet_data (the_geom)' 
     || 'SELECT n.the_geom FROM n WHERE n.cartodb_id < 0 AND ' 
     || ' n.the_geom IS NOT NULL RETURNING cartodb_id) ' 
     || 'SELECT 0,cartodb_id FROM do_update UNION ALL ' 
     || 'SELECT 1,cartodb_id FROM do_insert UNION ALL ' 
     || 'SELECT -1,cartodb_id FROM do_delete'; 

    RAISE DEBUG '%', sql; 

    RETURN QUERY EXECUTE sql; 

    END; 
    $$; 

    -- Grant access to the public user 
    GRANT EXECUTE ON FUNCTION leaflet_upsert_usercomments(integer[],text[]) TO publicuser; 
+1

相關問題:http://gis.stackexchange.com/questions/134544/in-cartodb-best-way-to-have- a-table-with-multiple-contributors – zrobby

+1

相關解決方案:https://github.com/radumas/crowdmap-basic – zrobby

回答

0

我之前的回答太過分了,它很快就會被棄用。

執行此操作的正確方法是使用SECURITY DEFINER設置一個函數,該函數使用該函數的所有者權限運行INSERT查詢。

這裏檢查它 - >https://gist.github.com/ernesmb/beb25f539f8ff38bbd891e6d114ea7f4

希望它能幫助!

+0

完美的作品!謝謝!! – zrobby

0

有可能是一個更簡單的方法,授予特定的權限,以在使用該表(或列),而不是創建一個複雜的安全定義器的功能。

如你只是想加點,你可以使用類似什麼在使用本例所示:http://bl.ocks.org/iriberri/7d84ed35ef0b5e80555d

這是前端應用程序的一部分。爲了授予您對錶的足夠權限,您應該從CARTO編輯器的SQL面板或通過SQL API運行以下SQL。

GRANT INSERT (column1, column2, ...) ON tableName TO publicuser; 

GRANT USAGE ON SEQUENCE tableName_cartodb_id_seq_0 TO publicuser; 

如果有錯誤,你可以從開發工具網絡選項卡對其進行調試,SQL調用將返回錯誤的描述。

授予權限後,您應該能夠在不驗證您的調用的情況下從前端運行INSERT查詢。 請注意風險。

+0

埃內斯托,謝謝你的回覆!我沒有考慮過安全定義者的替代方法,但是您的方法對於我的應用程序的簡單性來說是有意義的。我會很快跟進。 – zrobby