Skip to content

PostgreSQL / MySQL Output ​

Export query results directly to PostgreSQL or MySQL databases.

PostgreSQL ​

Usage ​

bash
loq -o:POSTGRESQL --connection:"host=localhost dbname=mydb" \
          --otable:results \
          "SELECT * FROM data.csv"

Connection String ​

PostgreSQL connection string format:

bash
--connection:"host=localhost port=5432 dbname=mydb user=myuser password=mypass"

Parameters:

  • host: Database server hostname
  • port: Port (default: 5432)
  • dbname: Database name
  • user: Username
  • password: Password

Environment Variables ​

Alternatively, use standard PostgreSQL environment variables:

bash
export PGHOST=localhost
export PGPORT=5432
export PGDATABASE=mydb
export PGUSER=myuser
export PGPASSWORD=mypass

loq -o:POSTGRESQL --otable:results "SELECT * FROM data.csv"

Examples ​

bash
# Basic export
loq -o:POSTGRESQL \
          --connection:"host=localhost dbname=analytics user=etl password=secret" \
          --otable:access_logs \
          "SELECT * FROM access.log"

# Filtered export
loq -o:POSTGRESQL \
          --connection:"host=db.example.com dbname=prod user=app" \
          --otable:errors \
          "SELECT timestamp, level, message FROM logs.csv WHERE level = 'error'"

# Aggregated data
loq -o:POSTGRESQL \
          --connection:"host=localhost dbname=reports" \
          --otable:daily_summary \
          "SELECT date, COUNT(*) as requests, AVG(duration) as avg_time
           FROM access.log
           GROUP BY date"

Type Mapping ​

loq TypePostgreSQL Type
IntegerBIGINT
FloatDOUBLE PRECISION
BooleanBOOLEAN
StringTEXT
NULLNULL
DateTimeTIMESTAMP

MySQL ​

Usage ​

bash
loq -o:MYSQL \
          --host:localhost --port:3306 \
          --database:mydb --user:myuser --password:mypass \
          --otable:results \
          "SELECT * FROM data.csv"

Connection Parameters ​

ParameterDescriptionDefault
--hostServer hostnamelocalhost
--portServer port3306
--databaseDatabase namerequired
--userUsernamerequired
--passwordPasswordempty

Examples ​

bash
# Basic export
loq -o:MYSQL \
          --host:localhost --database:analytics \
          --user:etl --password:secret \
          --otable:logs \
          "SELECT * FROM app.log"

# Remote server
loq -o:MYSQL \
          --host:db.example.com --port:3306 \
          --database:production --user:app \
          --otable:events \
          "SELECT * FROM events.csv"

Type Mapping ​

loq TypeMySQL Type
IntegerBIGINT
FloatDOUBLE
BooleanTINYINT(1)
StringTEXT
NULLNULL
DateTimeDATETIME

Common Features ​

Table Creation ​

Tables are created automatically with appropriate column types based on the query results.

Existing Tables ​

If the table exists:

  • New rows are appended
  • Schema must be compatible

To replace data, drop the table first:

bash
# PostgreSQL
psql -c "DROP TABLE IF EXISTS results" mydb
loq -o:POSTGRESQL --connection:"..." --otable:results "SELECT * FROM data.csv"

# MySQL
mysql -e "DROP TABLE IF EXISTS results" mydb
loq -o:MYSQL --database:mydb --otable:results "SELECT * FROM data.csv"

Transactions ​

Inserts are wrapped in transactions for:

  • Consistency (all-or-nothing)
  • Performance (fewer commits)

Batch Inserts ​

Large exports use batch inserts for efficiency.

ETL Patterns ​

Extract, Transform, Load ​

bash
# Extract and transform with loq, load to PostgreSQL
loq -o:POSTGRESQL \
          --connection:"host=warehouse dbname=dwh user=etl" \
          --otable:fact_sales \
          "SELECT
               date,
               customer_id,
               UPPER(category) AS category,
               ROUND(amount, 2) AS amount
           FROM raw_sales.csv
           WHERE amount > 0"

Incremental Load ​

bash
# Load only new records
loq -o:POSTGRESQL \
          --connection:"host=localhost dbname=logs" \
          --otable:access_logs \
          "SELECT * FROM today.log"

Dimension Tables ​

bash
# Load dimension table
loq -o:POSTGRESQL \
          --connection:"host=localhost dbname=dwh" \
          --otable:dim_customers \
          "SELECT DISTINCT
               customer_id,
               customer_name,
               region
           FROM orders.csv"

Security ​

Password Handling ​

Avoid passwords in command line (visible in process list):

bash
# PostgreSQL: use .pgpass file
echo "localhost:5432:mydb:myuser:mypass" >> ~/.pgpass
chmod 600 ~/.pgpass

# MySQL: use .my.cnf
echo "[client]
password=mypass" >> ~/.my.cnf
chmod 600 ~/.my.cnf

SSL/TLS ​

PostgreSQL:

bash
--connection:"host=db.example.com dbname=mydb sslmode=require"

MySQL:

bash
--ssl-mode:required

Troubleshooting ​

Connection Failed ​

  1. Verify server is running
  2. Check hostname and port
  3. Verify credentials
  4. Check firewall rules
  5. Verify SSL requirements
bash
# Test PostgreSQL connection
psql -h localhost -U myuser -d mydb -c "SELECT 1"

# Test MySQL connection
mysql -h localhost -u myuser -p mydb -e "SELECT 1"

Permission Denied ​

Ensure user has:

  • CREATE TABLE permission (for new tables)
  • INSERT permission (for data)
sql
-- PostgreSQL
GRANT CREATE, INSERT ON SCHEMA public TO myuser;

-- MySQL
GRANT CREATE, INSERT ON mydb.* TO 'myuser'@'localhost';

Type Mismatch ​

If existing table has incompatible types:

  1. Drop and recreate the table
  2. Or modify the existing schema

Large Exports ​

For very large exports:

bash
# Use smaller batches (implementation-dependent)
# Or export to CSV first, then bulk load

loq -o:CSV --ofile:temp.csv "SELECT * FROM huge.csv"
psql -c "\COPY results FROM 'temp.csv' CSV HEADER" mydb

Alternatives ​

SQLite for Local Analysis ​

For local analysis, SQLite is simpler:

bash
loq -o:SQLITE --ofile:analysis.db "SELECT * FROM data.csv"

CSV for Bulk Load ​

For maximum performance, export to CSV and use database bulk load:

bash
# Export to CSV
loq -o:CSV --ofile:data.csv "SELECT * FROM source.csv"

# PostgreSQL COPY
psql -c "\COPY table FROM 'data.csv' CSV HEADER" mydb

# MySQL LOAD DATA
mysql -e "LOAD DATA INFILE 'data.csv' INTO TABLE table FIELDS TERMINATED BY ','" mydb

See Also ​

All rights reserved.