{"ok": true, "next": null, "rows": [{"id": "changelog:writable-canned-queries", "page": "changelog", "ref": "writable-canned-queries", "title": "Writable canned queries", "content": "Datasette's  Canned queries  feature lets you define SQL queries in  metadata.json  which can then be executed by users visiting a specific URL.  https://latest.datasette.io/fixtures/neighborhood_search  for example. \n                 Canned queries were previously restricted to  SELECT , but Datasette 0.44 introduces the ability for canned queries to execute  INSERT  or  UPDATE  queries as well, using the new  \"write\": true  property ( #800 ): \n                 {\n    \"databases\": {\n        \"dogs\": {\n            \"queries\": {\n                \"add_name\": {\n                    \"sql\": \"INSERT INTO names (name) VALUES (:name)\",\n                    \"write\": true\n                }\n            }\n        }\n    }\n} \n                 See  Writable canned queries  for more details.", "breadcrumbs": "[\"Changelog\", \"0.44 (2020-06-11)\"]", "references": "[{\"href\": \"https://latest.datasette.io/fixtures/neighborhood_search\", \"label\": \"https://latest.datasette.io/fixtures/neighborhood_search\"}, {\"href\": \"https://github.com/simonw/datasette/issues/800\", \"label\": \"#800\"}]"}, {"id": "sql_queries:canned-queries-writable", "page": "sql_queries", "ref": "canned-queries-writable", "title": "Writable canned queries", "content": "Canned queries by default are read-only. You can use the  \"write\": true  key to indicate that a canned query can write to the database. \n                 See  Access to specific canned queries  for details on how to add permission checks to canned queries, using the  \"allow\"  key. \n                 [[[cog\nconfig_example(cog, {\n    \"databases\": {\n        \"mydatabase\": {\n            \"queries\": {\n                \"add_name\": {\n                    \"sql\": \"INSERT INTO names (name) VALUES (:name)\",\n                    \"write\": True\n                }\n            }\n        }\n    }\n}) \n                 ]]] \n                 [[[end]]] \n                 This configuration will create a page at  /mydatabase/add_name  displaying a form with a  name  field. Submitting that form will execute the configured  INSERT  query. \n                 You can customize how Datasette represents success and errors using the following optional properties: \n                 \n                     \n                         on_success_message  - the message shown when a query is successful \n                     \n                     \n                         on_success_message_sql  - alternative to  on_success_message : a SQL query that should be executed to generate the message \n                     \n                     \n                         on_success_redirect  - the path or URL the user is redirected to on success \n                     \n                     \n                         on_error_message  - the message shown when a query throws an error \n                     \n                     \n                         on_error_redirect  - the path or URL the user is redirected to on error \n                     \n                 \n                 For example: \n                 [[[cog\nconfig_example(cog, {\n    \"databases\": {\n        \"mydatabase\": {\n            \"queries\": {\n                \"add_name\": {\n                    \"sql\": \"INSERT INTO names (name) VALUES (:name)\",\n                    \"params\": [\"name\"],\n                    \"write\": True,\n                    \"on_success_message_sql\": \"select 'Name inserted: ' || :name\",\n                    \"on_success_redirect\": \"/mydatabase/names\",\n                    \"on_error_message\": \"Name insert failed\",\n                    \"on_error_redirect\": \"/mydatabase\",\n                }\n            }\n        }\n    }\n}) \n                 ]]] \n                 [[[end]]] \n                 You can use  \"params\"  to explicitly list the named parameters that should be displayed as form fields - otherwise they will be automatically detected.  \"params\"  is not necessary in the above example, since without it  \"name\"  would be automatically detected from the query. \n                 You can pre-populate form fields when the page first loads using a query string, e.g.  /mydatabase/add_name?name=Prepopulated . The user will have to submit the form to execute the query. \n                 If you specify a query in  \"on_success_message_sql\" , that query will be executed after the main query. The first column of the first row return by that query will be displayed as a success message. Named parameters from the main query will be made available to the success message query as well.", "breadcrumbs": "[\"Running SQL queries\", \"Canned queries\"]", "references": "[]"}], "truncated": false}