"use strict";(self.webpackChunkdocs_v_2=self.webpackChunkdocs_v_2||[]).push([[9617],{86099:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>u,frontMatter:()=>s,metadata:()=>i,toc:()=>c});var n=a(83117),r=(a(67294),a(3905));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.kt)(d,(0,n.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"extra-database-settings"},"Extra Database Settings"),(0,r.kt)("h3",{id:"deeper-sqlalchemy-integration"},"Deeper SQLAlchemy Integration"),(0,r.kt)("p",null,"It is possible to tweak the database connection information using the parameters exposed by\nSQLAlchemy. In the ",(0,r.kt)("strong",{parentName:"p"},"Database edit")," view, you can edit the ",(0,r.kt)("strong",{parentName:"p"},"Extra")," field as a JSON blob."),(0,r.kt)("p",null,"This JSON string contains extra configuration elements. The ",(0,r.kt)("inlineCode",{parentName:"p"},"engine_params")," object gets unpacked\ninto the ",(0,r.kt)("inlineCode",{parentName:"p"},"sqlalchemy.create_engine")," call, while the ",(0,r.kt)("inlineCode",{parentName:"p"},"metadata_params")," get unpacked into the\n",(0,r.kt)("inlineCode",{parentName:"p"},"sqlalchemy.MetaData")," call. Refer to the SQLAlchemy docs for more information."),(0,r.kt)("h3",{id:"schemas"},"Schemas"),(0,r.kt)("p",null,"Databases like Postgres and Redshift use the ",(0,r.kt)("strong",{parentName:"p"},"schema")," as the logical entity on top of the\n",(0,r.kt)("strong",{parentName:"p"},"database"),". For Superset to connect to a specific schema, you can set the ",(0,r.kt)("strong",{parentName:"p"},"schema")," parameter in\nthe ",(0,r.kt)("strong",{parentName:"p"},"Edit Tables")," form (Sources > Tables > Edit record)."),(0,r.kt)("h3",{id:"external-password-store-for-sqlalchemy-connections"},"External Password Store for SQLAlchemy Connections"),(0,r.kt)("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.kt)("p",null,"Example: Write a function that takes a single argument of type ",(0,r.kt)("inlineCode",{parentName:"p"},"sqla.engine.url")," and returns the\npassword for the given connection string. Then set ",(0,r.kt)("inlineCode",{parentName:"p"},"SQLALCHEMY_CUSTOM_PASSWORD_STORE")," in your config\nfile to point to that function."),(0,r.kt)("pre",null,(0,r.kt)("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.kt)("p",null,"A common pattern is to use environment variables to make secrets available.\n",(0,r.kt)("inlineCode",{parentName:"p"},"SQLALCHEMY_CUSTOM_PASSWORD_STORE")," can also be used for that purpose."),(0,r.kt)("pre",null,(0,r.kt)("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.kt)("h3",{id:"ssl-access-to-databases"},"SSL Access to Databases"),(0,r.kt)("p",null,"You can use the ",(0,r.kt)("inlineCode",{parentName:"p"},"Extra")," field in the ",(0,r.kt)("strong",{parentName:"p"},"Edit Databases")," form to configure SSL:"),(0,r.kt)("pre",null,(0,r.kt)("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},3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>f});var n=a(67294);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,f=d["".concat(l,".").concat(m)]||d[m]||u[m]||s;return a?n.createElement(f,o(o({ref:t},p),{},{components:a})):n.createElement(f,o({ref:t},p))}));function f(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"}}]);