"use strict";(self.webpackChunkdocs_v_2=self.webpackChunkdocs_v_2||[]).push([[5132],{95788:(e,t,r)=>{r.d(t,{Iu:()=>p,yg:()=>y});var a=r(11504);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function s(e,t){if(null==e)return{};var r,a,n=function(e,t){if(null==e)return{};var r,a,n={},o=Object.keys(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var l=a.createContext({}),c=function(e){var t=a.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},p=function(e){var t=c(e.components);return a.createElement(l.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(r),d=n,y=u["".concat(l,".").concat(d)]||u[d]||m[d]||o;return r?a.createElement(y,i(i({ref:t},p),{},{components:r})):a.createElement(y,i({ref:t},p))}));function y(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,i=new Array(o);i[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[u]="string"==typeof e?e:n,i[1]=s;for(var c=2;c<o;c++)i[c]=r[c];return a.createElement.apply(null,i)}return a.createElement.apply(null,r)}d.displayName="MDXCreateElement"},28944:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var a=r(45072),n=(r(11504),r(95788));const o={title:"Vertica",hide_title:!0,sidebar_position:32,version:1},i=void 0,s={unversionedId:"databases/vertica",id:"databases/vertica",title:"Vertica",description:"Vertica",source:"@site/docs/databases/vertica.mdx",sourceDirName:"databases",slug:"/databases/vertica",permalink:"/docs/databases/vertica",draft:!1,editUrl:"https://github.com/apache/superset/edit/master/docs/docs/databases/vertica.mdx",tags:[],version:"current",sidebarPosition:32,frontMatter:{title:"Vertica",hide_title:!0,sidebar_position:32,version:1},sidebar:"tutorialSidebar",previous:{title:"TimescaleDB",permalink:"/docs/databases/timescaledb"},next:{title:"Hologres",permalink:"/docs/databases/hologres"}},l={},c=[{value:"Vertica",id:"vertica",level:2}],p={toc:c},u="wrapper";function m(e){let{components:t,...r}=e;return(0,n.yg)(u,(0,a.c)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("h2",{id:"vertica"},"Vertica"),(0,n.yg)("p",null,"The recommended connector library is\n",(0,n.yg)("a",{parentName:"p",href:"https://pypi.org/project/sqlalchemy-vertica-python/"},"sqlalchemy-vertica-python"),". The\n",(0,n.yg)("a",{parentName:"p",href:"http://www.vertica.com/"},"Vertica")," connection parameters are:"),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("strong",{parentName:"li"},"User Name:")," UserName"),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("strong",{parentName:"li"},"Password:")," DBPassword"),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("strong",{parentName:"li"},"Database Host:"),(0,n.yg)("ul",{parentName:"li"},(0,n.yg)("li",{parentName:"ul"},"For Localhost : localhost or 127.0.0.1"),(0,n.yg)("li",{parentName:"ul"},"For On Prem : IP address or Host name"),(0,n.yg)("li",{parentName:"ul"},"For Cloud: IP Address or Host Name"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("strong",{parentName:"li"},"Database Name:")," Database Name"),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("strong",{parentName:"li"},"Port:")," default 5433")),(0,n.yg)("p",null,"The connection string is formatted as follows:"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre"},"vertica+vertica_python://{username}:{password}@{host}/{database}\n")),(0,n.yg)("p",null,"Other parameters:"),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},"Load Balancer - Backup Host")))}m.isMDXComponent=!0}}]);