[{"data":1,"prerenderedAt":736},["ShallowReactive",2],{"docs-\u002Fdocs\u002Fstreams\u002Ftarget-configuration":3},{"id":4,"title":5,"body":6,"description":727,"extension":728,"meta":729,"navigation":730,"path":731,"redirect":732,"seo":733,"stem":734,"__hash__":735},"docs\u002Fdocs\u002Fstreams\u002Ftarget-configuration.md","Target Configuration",{"type":7,"value":8,"toc":717},"minimark",[9,13,17,29,34,37,102,105,133,137,144,147,243,246,284,297,301,307,309,388,390,420,424,430,432,543,545,565,569,579,582,600,604,610,613,645,649,652,681,685,713],[10,11,5],"h1",{"id":12},"target-configuration",[14,15,16],"p",{},"Use this page when you need to define where a stream writes and what writer-specific settings apply to that target.",[14,18,19,20,24,25,28],{},"Every target configuration starts with ",[21,22,23],"code",{},"target.id"," plus one target family under ",[21,26,27],{},"target.spec",".",[30,31,33],"h2",{"id":32},"target-shape","Target shape",[14,35,36],{},"The target object always looks like this:",[38,39,44],"pre",{"className":40,"code":41,"language":42,"meta":43,"style":43},"language-json shiki shiki-themes github-light github-dark","{\n  \"id\": \"conn_target\",\n  \"spec\": {\n    \"db\": {}\n  }\n}\n","json","",[21,45,46,55,72,81,90,96],{"__ignoreMap":43},[47,48,51],"span",{"class":49,"line":50},"line",1,[47,52,54],{"class":53},"sVt8B","{\n",[47,56,58,62,65,69],{"class":49,"line":57},2,[47,59,61],{"class":60},"sj4cs","  \"id\"",[47,63,64],{"class":53},": ",[47,66,68],{"class":67},"sZZnC","\"conn_target\"",[47,70,71],{"class":53},",\n",[47,73,75,78],{"class":49,"line":74},3,[47,76,77],{"class":60},"  \"spec\"",[47,79,80],{"class":53},": {\n",[47,82,84,87],{"class":49,"line":83},4,[47,85,86],{"class":60},"    \"db\"",[47,88,89],{"class":53},": {}\n",[47,91,93],{"class":49,"line":92},5,[47,94,95],{"class":53},"  }\n",[47,97,99],{"class":49,"line":98},6,[47,100,101],{"class":53},"}\n",[14,103,104],{},"Rules:",[106,107,108,114,119],"ul",{},[109,110,111,113],"li",{},[21,112,23],{}," selects the stored destination connection",[109,115,116,118],{},[21,117,27],{}," contains exactly one target family",[109,120,121,122,125,126,129,130],{},"valid target families are ",[21,123,124],{},"db",", ",[21,127,128],{},"files",", and ",[21,131,132],{},"s3",[30,134,136],{"id":135},"database-targets","Database targets",[14,138,139,140,143],{},"Use ",[21,141,142],{},"target.spec.db"," when the stream writes to MySQL or PostgreSQL.",[14,145,146],{},"Typical shape:",[38,148,150],{"className":40,"code":149,"language":42,"meta":43,"style":43},"{\n  \"id\": \"conn_postgres_target\",\n  \"spec\": {\n    \"db\": {\n      \"database\": \"analytics\",\n      \"schema\": \"public\",\n      \"schemaPolicy\": \"create_missing_only\",\n      \"writeMode\": \"upsert\"\n    }\n  }\n}\n",[21,151,152,156,167,173,179,191,203,216,227,233,238],{"__ignoreMap":43},[47,153,154],{"class":49,"line":50},[47,155,54],{"class":53},[47,157,158,160,162,165],{"class":49,"line":57},[47,159,61],{"class":60},[47,161,64],{"class":53},[47,163,164],{"class":67},"\"conn_postgres_target\"",[47,166,71],{"class":53},[47,168,169,171],{"class":49,"line":74},[47,170,77],{"class":60},[47,172,80],{"class":53},[47,174,175,177],{"class":49,"line":83},[47,176,86],{"class":60},[47,178,80],{"class":53},[47,180,181,184,186,189],{"class":49,"line":92},[47,182,183],{"class":60},"      \"database\"",[47,185,64],{"class":53},[47,187,188],{"class":67},"\"analytics\"",[47,190,71],{"class":53},[47,192,193,196,198,201],{"class":49,"line":98},[47,194,195],{"class":60},"      \"schema\"",[47,197,64],{"class":53},[47,199,200],{"class":67},"\"public\"",[47,202,71],{"class":53},[47,204,206,209,211,214],{"class":49,"line":205},7,[47,207,208],{"class":60},"      \"schemaPolicy\"",[47,210,64],{"class":53},[47,212,213],{"class":67},"\"create_missing_only\"",[47,215,71],{"class":53},[47,217,219,222,224],{"class":49,"line":218},8,[47,220,221],{"class":60},"      \"writeMode\"",[47,223,64],{"class":53},[47,225,226],{"class":67},"\"upsert\"\n",[47,228,230],{"class":49,"line":229},9,[47,231,232],{"class":53},"    }\n",[47,234,236],{"class":49,"line":235},10,[47,237,95],{"class":53},[47,239,241],{"class":49,"line":240},11,[47,242,101],{"class":53},[14,244,245],{},"Key points:",[106,247,248,254,260,266,272,278],{},[109,249,250,253],{},[21,251,252],{},"database"," selects the target database",[109,255,256,259],{},[21,257,258],{},"schema"," is optional and depends on the target engine",[109,261,262,265],{},[21,263,264],{},"structureOptions"," controls what structure objects may be created",[109,267,268,271],{},[21,269,270],{},"schemaPolicy"," controls how existing tables are treated",[109,273,274,277],{},[21,275,276],{},"writeMode"," controls how existing rows are treated",[109,279,280,283],{},[21,281,282],{},"skipData"," turns the run into structure-only output",[14,285,139,286,291,292,296],{},[287,288,290],"a",{"href":289},"\u002Fdocs\u002Fstreams\u002Ftarget-data-policies","Target Schema and Data Policies"," and ",[287,293,295],{"href":294},"\u002Fdocs\u002Fstreams\u002Fdatabase-structure-options","Database Structure Options"," for the behavioral choices behind those fields.",[30,298,300],{"id":299},"local-file-targets","Local file targets",[14,302,139,303,306],{},[21,304,305],{},"target.spec.files"," when the stream should write CSV, JSONL, or Parquet files to a local filesystem connection.",[14,308,146],{},[38,310,312],{"className":40,"code":311,"language":42,"meta":43,"style":43},"{\n  \"id\": \"conn_files_local\",\n  \"spec\": {\n    \"files\": {\n      \"fileFormat\": \"parquet\",\n      \"format\": {\n        \"compression\": \"zstd\"\n      }\n    }\n  }\n}\n",[21,313,314,318,329,335,342,354,361,371,376,380,384],{"__ignoreMap":43},[47,315,316],{"class":49,"line":50},[47,317,54],{"class":53},[47,319,320,322,324,327],{"class":49,"line":57},[47,321,61],{"class":60},[47,323,64],{"class":53},[47,325,326],{"class":67},"\"conn_files_local\"",[47,328,71],{"class":53},[47,330,331,333],{"class":49,"line":74},[47,332,77],{"class":60},[47,334,80],{"class":53},[47,336,337,340],{"class":49,"line":83},[47,338,339],{"class":60},"    \"files\"",[47,341,80],{"class":53},[47,343,344,347,349,352],{"class":49,"line":92},[47,345,346],{"class":60},"      \"fileFormat\"",[47,348,64],{"class":53},[47,350,351],{"class":67},"\"parquet\"",[47,353,71],{"class":53},[47,355,356,359],{"class":49,"line":98},[47,357,358],{"class":60},"      \"format\"",[47,360,80],{"class":53},[47,362,363,366,368],{"class":49,"line":205},[47,364,365],{"class":60},"        \"compression\"",[47,367,64],{"class":53},[47,369,370],{"class":67},"\"zstd\"\n",[47,372,373],{"class":49,"line":218},[47,374,375],{"class":53},"      }\n",[47,377,378],{"class":49,"line":229},[47,379,232],{"class":53},[47,381,382],{"class":49,"line":235},[47,383,95],{"class":53},[47,385,386],{"class":49,"line":240},[47,387,101],{"class":53},[14,389,245],{},[106,391,392,408,414],{},[109,393,394,397,398,125,401,404,405],{},[21,395,396],{},"fileFormat"," chooses ",[21,399,400],{},"csv",[21,402,403],{},"jsonl",", or ",[21,406,407],{},"parquet",[109,409,410,413],{},[21,411,412],{},"format"," holds compression and format-specific settings",[109,415,416,419],{},[21,417,418],{},"outputDirectory"," is optional and is often omitted because the connection base path determines the final location",[30,421,423],{"id":422},"s3-targets","S3 targets",[14,425,139,426,429],{},[21,427,428],{},"target.spec.s3"," when the stream should write files locally and then upload them to S3-compatible storage.",[14,431,146],{},[38,433,435],{"className":40,"code":434,"language":42,"meta":43,"style":43},"{\n  \"id\": \"conn_s3_target\",\n  \"spec\": {\n    \"s3\": {\n      \"fileFormat\": \"parquet\",\n      \"format\": {\n        \"compression\": \"zstd\"\n      },\n      \"upload\": {\n        \"bucket\": \"analytics-exports\",\n        \"prefix\": \"daily\u002F\"\n      }\n    }\n  }\n}\n",[21,436,437,441,452,458,465,475,481,489,494,501,513,523,528,533,538],{"__ignoreMap":43},[47,438,439],{"class":49,"line":50},[47,440,54],{"class":53},[47,442,443,445,447,450],{"class":49,"line":57},[47,444,61],{"class":60},[47,446,64],{"class":53},[47,448,449],{"class":67},"\"conn_s3_target\"",[47,451,71],{"class":53},[47,453,454,456],{"class":49,"line":74},[47,455,77],{"class":60},[47,457,80],{"class":53},[47,459,460,463],{"class":49,"line":83},[47,461,462],{"class":60},"    \"s3\"",[47,464,80],{"class":53},[47,466,467,469,471,473],{"class":49,"line":92},[47,468,346],{"class":60},[47,470,64],{"class":53},[47,472,351],{"class":67},[47,474,71],{"class":53},[47,476,477,479],{"class":49,"line":98},[47,478,358],{"class":60},[47,480,80],{"class":53},[47,482,483,485,487],{"class":49,"line":205},[47,484,365],{"class":60},[47,486,64],{"class":53},[47,488,370],{"class":67},[47,490,491],{"class":49,"line":218},[47,492,493],{"class":53},"      },\n",[47,495,496,499],{"class":49,"line":229},[47,497,498],{"class":60},"      \"upload\"",[47,500,80],{"class":53},[47,502,503,506,508,511],{"class":49,"line":235},[47,504,505],{"class":60},"        \"bucket\"",[47,507,64],{"class":53},[47,509,510],{"class":67},"\"analytics-exports\"",[47,512,71],{"class":53},[47,514,515,518,520],{"class":49,"line":240},[47,516,517],{"class":60},"        \"prefix\"",[47,519,64],{"class":53},[47,521,522],{"class":67},"\"daily\u002F\"\n",[47,524,526],{"class":49,"line":525},12,[47,527,375],{"class":53},[47,529,531],{"class":49,"line":530},13,[47,532,232],{"class":53},[47,534,536],{"class":49,"line":535},14,[47,537,95],{"class":53},[47,539,541],{"class":49,"line":540},15,[47,542,101],{"class":53},[14,544,245],{},[106,546,547,552,559],{},[109,548,549,551],{},[21,550,418],{}," is the local staging area before upload",[109,553,554,291,556,558],{},[21,555,396],{},[21,557,412],{}," work the same way as local file targets",[109,560,561,564],{},[21,562,563],{},"upload"," holds bucket, prefix, retention, and encryption behavior",[30,566,568],{"id":567},"shared-format-settings","Shared format settings",[14,570,571,572,575,576,28],{},"Use nested format settings under either ",[21,573,574],{},"target.spec.files.format"," or ",[21,577,578],{},"target.spec.s3.format",[14,580,581],{},"Important notes:",[106,583,584,592,597],{},[109,585,586,291,589,591],{},[21,587,588],{},"compression",[21,590,407],{}," are consumed by file-based targets in the current backend",[109,593,594,596],{},[21,595,400],{}," exists in the schema, but custom CSV target formatting is not wired into the writer path yet",[109,598,599],{},"Parquet settings are available through the API and saved configs even when the UI does not expose them",[30,601,603],{"id":602},"upload-settings","Upload settings",[14,605,139,606,609],{},[21,607,608],{},"target.spec.s3.upload"," when the target is S3-compatible storage.",[14,611,612],{},"Important fields:",[106,614,615,621,627,633],{},[109,616,617,620],{},[21,618,619],{},"bucket"," for the destination bucket",[109,622,623,626],{},[21,624,625],{},"prefix"," for an optional object key prefix",[109,628,629,632],{},[21,630,631],{},"keepLocalFiles"," when staged files should remain after upload",[109,634,635,125,638,129,641,644],{},[21,636,637],{},"storageClass",[21,639,640],{},"serverSideEnc",[21,642,643],{},"kmsKeyId"," for storage and encryption behavior",[30,646,648],{"id":647},"verification","Verification",[14,650,651],{},"Before saving or using a target config:",[106,653,654,660,665,672,678],{},[109,655,656,657,659],{},"confirm ",[21,658,27],{}," contains exactly one family object",[109,661,662,663],{},"confirm database targets keep policy fields under ",[21,664,142],{},[109,666,667,668,575,670],{},"confirm file targets keep format fields under ",[21,669,574],{},[21,671,578],{},[109,673,674,675,677],{},"confirm S3 targets include ",[21,676,563],{}," settings when remote upload behavior matters",[109,679,680],{},"confirm CSV target formatting expectations match the current writer defaults",[30,682,684],{"id":683},"related-docs","Related docs",[106,686,687,693,699,705,709],{},[109,688,689],{},[287,690,692],{"href":691},"\u002Fdocs\u002Fstreams\u002Fstream-configuration-overview","Stream Configuration Overview",[109,694,695],{},[287,696,698],{"href":697},"\u002Fdocs\u002Fstreams\u002Fstream-config-reference","Stream Configuration Reference",[109,700,701],{},[287,702,704],{"href":703},"\u002Fdocs\u002Fstreams\u002Fstream-examples","Stream Configuration Examples",[109,706,707],{},[287,708,290],{"href":289},[109,710,711],{},[287,712,295],{"href":294},[714,715,716],"style",{},"html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":43,"searchDepth":57,"depth":57,"links":718},[719,720,721,722,723,724,725,726],{"id":32,"depth":57,"text":33},{"id":135,"depth":57,"text":136},{"id":299,"depth":57,"text":300},{"id":422,"depth":57,"text":423},{"id":567,"depth":57,"text":568},{"id":602,"depth":57,"text":603},{"id":647,"depth":57,"text":648},{"id":683,"depth":57,"text":684},"Define where a DBConvert Streams configuration writes, including database, local file, and S3 targets.","md",{},false,"\u002Fdocs\u002Fstreams\u002Ftarget-configuration",null,{"title":5,"description":727},"docs\u002Fstreams\u002Ftarget-configuration","jRbzntvK3mx1Rexx3QpnD2Y28P9jKxnDHSGLM-UQM4w",1783896284831]