blob: 9737fa7891905344565bfeb2c16e21957271e375 [file] [log] [blame]
"use strict";(self.webpackChunkdocs_v_2=self.webpackChunkdocs_v_2||[]).push([[6544],{95788:(e,t,a)=>{a.d(t,{Iu:()=>p,yg:()=>g});var n=a(11504);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function s(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?s(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):s(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function i(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},s=Object.keys(e);for(n=0;n<s.length;n++)a=s[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n<s.length;n++)a=s[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var l=n.createContext({}),c=function(e){var t=n.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},p=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,s=e.originalType,l=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),d=c(a),m=r,g=d["".concat(l,".").concat(m)]||d[m]||u[m]||s;return a?n.createElement(g,o(o({ref:t},p),{},{components:a})):n.createElement(g,o({ref:t},p))}));function g(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var s=a.length,o=new Array(s);o[0]=m;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[d]="string"==typeof e?e:r,o[1]=i;for(var c=2;c<s;c++)o[c]=a[c];return n.createElement.apply(null,o)}return n.createElement.apply(null,a)}m.displayName="MDXCreateElement"},95228:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>u,frontMatter:()=>s,metadata:()=>i,toc:()=>c});var n=a(86404),r=(a(11504),a(95788));const s={title:"Extra Database Settings",hide_title:!0,sidebar_position:40,version:1},o=void 0,i={unversionedId:"databases/extra-settings",id:"databases/extra-settings",title:"Extra Database Settings",description:"Extra Database Settings",source:"@site/docs/databases/extra-settings.mdx",sourceDirName:"databases",slug:"/databases/extra-settings",permalink:"/docs/databases/extra-settings",draft:!1,editUrl:"https://github.com/apache/superset/tree/master/docs/docs/databases/extra-settings.mdx",tags:[],version:"current",sidebarPosition:40,frontMatter:{title:"Extra Database Settings",hide_title:!0,sidebar_position:40,version:1},sidebar:"tutorialSidebar",previous:{title:"Firebolt",permalink:"/docs/databases/firebolt"},next:{title:"kusto",permalink:"/docs/databases/kusto"}},l={},c=[{value:"Extra Database Settings",id:"extra-database-settings",level:2},{value:"Deeper SQLAlchemy Integration",id:"deeper-sqlalchemy-integration",level:3},{value:"Schemas",id:"schemas",level:3},{value:"External Password Store for SQLAlchemy Connections",id:"external-password-store-for-sqlalchemy-connections",level:3},{value:"SSL Access to Databases",id:"ssl-access-to-databases",level:3}],p={toc:c},d="wrapper";function u(e){let{components:t,...a}=e;return(0,r.yg)(d,(0,n.c)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h2",{id:"extra-database-settings"},"Extra Database Settings"),(0,r.yg)("h3",{id:"deeper-sqlalchemy-integration"},"Deeper SQLAlchemy Integration"),(0,r.yg)("p",null,"It is possible to tweak the database connection information using the parameters exposed by\nSQLAlchemy. In the ",(0,r.yg)("strong",{parentName:"p"},"Database edit")," view, you can edit the ",(0,r.yg)("strong",{parentName:"p"},"Extra")," field as a JSON blob."),(0,r.yg)("p",null,"This JSON string contains extra configuration elements. The ",(0,r.yg)("inlineCode",{parentName:"p"},"engine_params")," object gets unpacked\ninto the ",(0,r.yg)("inlineCode",{parentName:"p"},"sqlalchemy.create_engine")," call, while the ",(0,r.yg)("inlineCode",{parentName:"p"},"metadata_params")," get unpacked into the\n",(0,r.yg)("inlineCode",{parentName:"p"},"sqlalchemy.MetaData")," call. Refer to the SQLAlchemy docs for more information."),(0,r.yg)("h3",{id:"schemas"},"Schemas"),(0,r.yg)("p",null,"Databases like Postgres and Redshift use the ",(0,r.yg)("strong",{parentName:"p"},"schema")," as the logical entity on top of the\n",(0,r.yg)("strong",{parentName:"p"},"database"),". For Superset to connect to a specific schema, you can set the ",(0,r.yg)("strong",{parentName:"p"},"schema")," parameter in\nthe ",(0,r.yg)("strong",{parentName:"p"},"Edit Tables")," form (Sources > Tables > Edit record)."),(0,r.yg)("h3",{id:"external-password-store-for-sqlalchemy-connections"},"External Password Store for SQLAlchemy Connections"),(0,r.yg)("p",null,"Superset can be configured to use an external store for database passwords. This is useful if you a\nrunning a custom secret distribution framework and do not wish to store secrets in Superset\u2019s meta\ndatabase."),(0,r.yg)("p",null,"Example: Write a function that takes a single argument of type ",(0,r.yg)("inlineCode",{parentName:"p"},"sqla.engine.url")," and returns the\npassword for the given connection string. Then set ",(0,r.yg)("inlineCode",{parentName:"p"},"SQLALCHEMY_CUSTOM_PASSWORD_STORE")," in your config\nfile to point to that function."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-python"},"def example_lookup_password(url):\n secret = <<get password from external framework>>\n return 'secret'\n\nSQLALCHEMY_CUSTOM_PASSWORD_STORE = example_lookup_password\n")),(0,r.yg)("p",null,"A common pattern is to use environment variables to make secrets available.\n",(0,r.yg)("inlineCode",{parentName:"p"},"SQLALCHEMY_CUSTOM_PASSWORD_STORE")," can also be used for that purpose."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-python"},"def example_password_as_env_var(url):\n # assuming the uri looks like\n # mysql://localhost?superset_user:{SUPERSET_PASSWORD}\n return url.password.format(**os.environ)\n\nSQLALCHEMY_CUSTOM_PASSWORD_STORE = example_password_as_env_var\n")),(0,r.yg)("h3",{id:"ssl-access-to-databases"},"SSL Access to Databases"),(0,r.yg)("p",null,"You can use the ",(0,r.yg)("inlineCode",{parentName:"p"},"Extra")," field in the ",(0,r.yg)("strong",{parentName:"p"},"Edit Databases")," form to configure SSL:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-JSON"},'{\n "metadata_params": {},\n "engine_params": {\n "connect_args":{\n "sslmode":"require",\n "sslrootcert": "/path/to/my/pem"\n }\n }\n}\n')))}u.isMDXComponent=!0}}]);