Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

meltanolabs-target-postgres

Package Overview
Dependencies
Maintainers
2
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

meltanolabs-target-postgres

Singer target for Postgres, built with the Meltano SDK for Singer Targets.

  • 0.2.0
  • PyPI
  • Socket score

Maintainers
2

target-postgres

PyPI - Version PyPI - Downloads PyPI - License Test target-postgres

Singer Target for PostgreSQL databases.

Built with the Meltano SDK for Singer Taps and Targets.

Capabilities

  • about
  • stream-maps
  • schema-flattening
  • validate-records
  • target-schema
  • hard-delete

Supported Python and PostgreSQL Versions

This target is tested with all actively supported Python and PostgreSQL versions. At the time of writing, this includes Python 3.9 through 3.13 and PostgreSQL 12 through 17.

Settings

SettingRequiredDefaultDescription
hostFalseNoneHostname for postgres instance.
portFalse5432The port on which postgres is awaiting connections.
userFalseNoneUser name used to authenticate.
passwordFalseNonePassword used to authenticate.
databaseFalseNoneDatabase name.
use_copyFalseNoneUse the COPY command to insert data. This is usually faster than INSERT statements. This option is only available for the postgres+psycopg dialect+driver combination.
default_target_schemaFalsemeltyPostgres schema to send data to, example: tap-clickup
activate_versionFalse1If set to false, the tap will ignore activate version messages. If set to true, add_record_metadata must be set to true as well.
hard_deleteFalse0When activate version is sent from a tap this specefies if we should delete the records that don't match, or mark them with a date in the _sdc_deleted_at column. This config option is ignored if activate_version is set to false.
add_record_metadataFalse1Note that this must be enabled for activate_version to work!This adds _sdc_extracted_at, _sdc_batched_at, and more to every table. See https://sdk.meltano.com/en/latest/implementation/record_metadata.html for more information.
interpret_content_encodingFalse0If set to true, the target will interpret the content encoding of the schema to determine how to store the data. Using this option may result in a more efficient storage of the data but may also result in an error if the data is not encoded as expected.
sanitize_null_text_charactersFalse0If set to true, the target will sanitize null characters in char/text/varchar fields, as they are not supported by Postgres. See postgres documentation for more information about chr(0) not being supported.
ssl_enableFalse0Whether or not to use ssl to verify the server's identity. Use ssl_certificate_authority and ssl_mode for further customization. To use a client certificate to authenticate yourself to the server, use ssl_client_certificate_enable instead.
ssl_client_certificate_enableFalse0Whether or not to provide client-side certificates as a method of authentication to the server. Use ssl_client_certificate and ssl_client_private_key for further customization. To use SSL to verify the server's identity, use ssl_enable instead.
ssl_modeFalseverify-fullSSL Protection method, see postgres documentation for more information. Must be one of disable, allow, prefer, require, verify-ca, or verify-full.
ssl_certificate_authorityFalse~/.postgresql/root.crlThe certificate authority that should be used to verify the server's identity. Can be provided either as the certificate itself (in .env) or as a filepath to the certificate.
ssl_client_certificateFalse~/.postgresql/postgresql.crtThe certificate that should be used to verify your identity to the server. Can be provided either as the certificate itself (in .env) or as a filepath to the certificate.
ssl_client_private_keyFalse~/.postgresql/postgresql.keyThe private key for the certificate you provided. Can be provided either as the certificate itself (in .env) or as a filepath to the certificate.
ssl_storage_directoryFalse.secretsThe folder in which to store SSL certificates provided as raw values. When a certificate/key is provided as a raw value instead of as a filepath, it must be written to a file before it can be used. This configuration option determines where that file is created.
ssh_tunnelFalseNoneSSH Tunnel Configuration, this is a json object
ssh_tunnel.enableFalse0Enable an ssh tunnel (also known as bastion host), see the other ssh_tunnel.* properties for more details
ssh_tunnel.hostFalseNoneHost of the bastion host, this is the host we'll connect to via ssh
ssh_tunnel.usernameFalseNoneUsername to connect to bastion host
ssh_tunnel.portFalse22Port to connect to bastion host
ssh_tunnel.private_keyFalseNonePrivate Key for authentication to the bastion host
ssh_tunnel.private_key_passwordFalseNonePrivate Key Password, leave None if no password is set

A full list of supported settings and capabilities is available by running: target-postgres --about

Built-in Settings

The following settings are automatically supported by the Meltano SDK and inherited by this target.

SettingRequiredDefaultDescription
load_methodFalseTargetLoadMethods.APPEND_ONLYThe method to use when loading data into the destination. append-only will always write all input records whether that records already exists or not. upsert will update existing records and insert new records. overwrite will delete all existing records and insert all input records.
batch_size_rowsFalseNoneMaximum number of rows in each batch.
validate_recordsFalse1Whether to validate the schema of the incoming streams.
stream_mapsFalseNoneConfig object for stream maps capability. For more information check out Stream Maps.
stream_map_configFalseNoneUser-defined config values to be used within map expressions.
faker_configFalseNoneConfig for the Faker instance variable fake used within map expressions. Only applicable if the plugin specifies faker as an addtional dependency (through the singer-sdk faker extra or directly).
faker_config.seedFalseNoneValue to seed the Faker generator for deterministic output: https://faker.readthedocs.io/en/master/#seeding-the-generator
faker_config.localeFalseNoneOne or more LCID locale strings to produce localized output for: https://faker.readthedocs.io/en/master/#localization
flattening_enabledFalseNone'True' to enable schema flattening and automatically expand nested properties.
flattening_max_depthFalseNoneThe max depth to flatten schemas.
Note on generating fake data

If you need access to the faker instance in your stream map expressions, you will need to install it as an additional dependency in your plugin.

If you're using Meltano, you can add the faker extra to your meltano.yml as follows:

  1. If you're installing the plugin from PyPI:
pip_url: "meltanolabs-target-postgres[faker]==<version>"
  1. If you're installing the plugin from the Git repository:
# Note the nested quotes
pip_url: "'meltanolabs-target-postgres[faker] @ git+https://github.com/MeltanoLabs/target-postgres.git@<ref>'"

Installation

Using pipx

pipx install meltanolabs-target-postgres

Using uv

uv tool install meltanolabs-target-postgres

Configuration

An Explanation of Various SSL Configuration Options

There are two distinct processes which both fall under the banner of SSL. One process occurs when the client wishes to ensure the identity of the server, and is the more common reason that SSL is used. Another is when the server wishes to ensure the identity of the client, for authentication/authorization purposes.

If your server is set up with a certificate and private key, and you wish to check their certificate against a root certificate which you posess, use ssl_enable. You may then further customize this process using the ssl_certificate_authority and ssl_mode settings. See the documentation for further details.

If your server is set up with a root certificate, and you wish to provide a certificate to the server to verify your identity, use ssl_client_certificate_enable. You may then further customize this process using the ssl_client_certificate and ssl_client_private_key settings. See the documentation for further details.

Configure using environment variables

This Singer target will automatically import any environment variables within the working directory's .env if the --config=ENV is provided, such that config values will be considered if a matching environment variable is set either in the terminal context or in the .env file.

Source Authentication and Authorization

The database account provided must have access to:

  1. Create schemas
  2. Create tables (DDL)
  3. Push Data to tables (DML)

Usage

You can easily run target-postgres by itself or in a pipeline using Meltano.

Executing the Target Directly

target-postgres --version
target-postgres --help
# Test using the "Carbon Intensity" sample:
pipx install git+https://gitlab.com/meltano/tap-carbon-intensity
tap-carbon-intensity | target-postgres --config /path/to/target-postgres-config.json

Using Docker Compose

docker-compose.yml provides the commands to create two empty sample databases using Docker. These can be a starting point to create your own database running in Docker, or can be used to run the tap's built-in tests.

Developer Resources

Initialize your Development Environment

pipx install poetry
poetry install
pipx install pre-commit
pre-commit install

Setting Up SSL Files

We have set the provided keys in the .ssl directory to be valid for multiple centuries. However, we have also provided configuration instructions below to create all of the necessary files for testing SSL.

A list of each file and its purpose:

  1. ca.crt: CA for client's certificate (stored on the server)
  2. cert.crt: Client's certificate (stored on the client)
  3. pkey.key: Client's private key (stored on the client)
  4. public_pkey.key: Client's private key with incorrect file permissions (stored on the client)
  5. root.crt: CA for server's certificate (stored on the client)
  6. server.crt: Server's certificate (stored on the server)
  7. server.key: Server's private key (stored on the server)

Run the following command to generate all relevant SSL files, with certificates valid for two centuries (73048 days).

openssl req -new -x509 -days 73048 -nodes -out ssl/server.crt -keyout ssl/server.key -subj "/CN=localhost" &&
openssl req -new -x509 -days 73048 -nodes -out ssl/cert.crt -keyout ssl/pkey.key -subj "/CN=postgres" &&
cp ssl/server.crt ssl/root.crt &&
cp ssl/cert.crt ssl/ca.crt &&
cp ssl/pkey.key ssl/public_pkey.key &&
chown 999:999 ssl/server.key &&
chmod 600 ssl/server.key &&
chmod 600 ssl/pkey.key &&
chmod 644 ssl/public_pkey.key

Now that all of the SSL files have been set up, you're ready to set up tests with pytest.

Create and Run Tests

Start the test databases using Docker Compose:

docker-compose up -d

Create tests within the target_postgres/tests subfolder and then run:

poetry run pytest

You can also test the target-postgres CLI interface directly using poetry run:

poetry run target-postgres --help

Testing with Meltano

Note: This target will work in any Singer environment and does not require Meltano. Examples here are for convenience and to streamline end-to-end orchestration scenarios.

Your project comes with a custom meltano.yml project file already created.

Next, install Meltano (if you haven't already) and any needed plugins:

# Install meltano
pipx install meltano
# Initialize meltano within this directory
meltano install

Now you can test and orchestrate using Meltano:

# Test invocation:
meltano invoke target-postgres --version

SDK Dev Guide

See the dev guide for more instructions on how to use the Meltano SDK to develop your own Singer taps and targets.

Data Types

The below table shows how this tap will map between jsonschema datatypes and Postgres datatypes.

jsonschemaPostgres
integerbigint
UNSUPPORTEDbigserial
UNSUPPORTEDbit [ (n) ]
UNSUPPORTEDbit varying [ (n) ]
booleanboolean
UNSUPPORTEDbox
string with contentEncoding="base16" (opt-in feature)bytea
UNSUPPORTEDcharacter [ (n) ]
UNSUPPORTEDcharacter varying [ (n) ]
UNSUPPORTEDcidr
UNSUPPORTEDcircle
string with format="date"date
UNSUPPORTEDdouble precision
UNSUPPORTEDinet
UNSUPPORTEDinteger
UNSUPPORTEDinterval [ fields ] [ (p) ]
UNSUPPORTEDjson
array; objectjsonb
UNSUPPORTEDline
UNSUPPORTEDlseg
UNSUPPORTEDmacaddr
UNSUPPORTEDmacaddr8
UNSUPPORTEDmoney
numbernumeric [ (p, s) ]
UNSUPPORTEDpath
UNSUPPORTEDpg_lsn
UNSUPPORTEDpg_snapshot
UNSUPPORTEDpoint
UNSUPPORTEDpolygon
UNSUPPORTEDreal
UNSUPPORTEDsmallint
UNSUPPORTEDsmallserial
UNSUPPORTEDserial
string without format; untypedtext
string with format="time"time [ (p) ] [ without time zone ]
UNSUPPORTEDtime [ (p) ] with time zone
string with format="date-time"timestamp [ (p) ] [ without time zone ]
UNSUPPORTEDtimestamp [ (p) ] with time zone
UNSUPPORTEDtsquery
UNSUPPORTEDtsvector
UNSUPPORTEDtxid_snapshot
string with format="uuid"uuid
UNSUPPORTEDxml

Note that while object types are mapped directly to jsonb, array types are mapped to a jsonb array.

If a column has multiple jsonschema types, the following order is using to order Postgres types, from highest priority to lowest priority.

  • BYTEA
  • ARRAY(JSONB)
  • JSONB
  • TEXT
  • TIMESTAMP
  • DATETIME
  • DATE
  • TIME
  • DECIMAL
  • BIGINT
  • INTEGER
  • BOOLEAN
  • NOTYPE

Content Encoding Support

Json Schema supports the contentEncoding keyword, which can be used to specify the encoding of input string types.

This target can detect content encoding clues in the schema to determine how to store the data in the postgres in a more efficient way.

Content encoding interpretation is disabled by default. This is because the default config is meant to be as permissive as possible, and do not make any assumptions about the data that could lead to data loss.

However if you know your data respects the advertised content encoding way, you can enable this feature to get better performance and storage efficiency.

To enable it, set the interpret_content_encoding option to True.

base16

The string is encoded using the base16 encoding, as defined in RFC 4648.

Example schema:

{
  "type": "object",
  "properties": {
    "my_hex": {
      "type": "string",
      "contentEncoding": "base16"
    }
  }
}

Data will be stored as a bytea in the database.

Example data:

# valid data
{ "my_hex": "01AF" }
{ "my_hex": "01af" }
{ "my_hex": "1af" }
{ "my_hex": "0x1234" }

# invalid data
{ "my_hex": " 0x1234 " }
{ "my_hex": "House" }

For convenience, data prefixed with 0x or containing an odd number of characters is supported although it's not part of the standard.

Keywords

FAQs


Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc