"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(45072),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/edit/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}}]);