154

I'm looking for a way to get all rows as INSERT statements from one specific table within a database using pg_dump in PostgreSQL.

E.g., I have table A and all rows in table A I need as INSERT statements, it should also dump those statements to a file.

Is this possible?

l0b0
  • 52,149
  • 24
  • 132
  • 195
Elitmiar
  • 32,536
  • 72
  • 175
  • 228

5 Answers5

301

if version < 8.4.0

pg_dump -D -t <table> <database>

Add -a before the -t if you only want the INSERTs, without the CREATE TABLE etc to set up the table in the first place.

version >= 8.4.0

pg_dump --column-inserts --data-only --table=<table> <database>
dexter
  • 12,937
  • 5
  • 36
  • 56
psmears
  • 23,925
  • 4
  • 38
  • 47
  • 65
    The -d and -D options were removed from PostgreSQL 8.4 (see 8.4.0 release notes). You must now use the "long" names: pg_dump --column-inserts --data-only --table=
    – Matthew Wood May 18 '10 at 14:49
  • 1
    The `-d`, `-a`, and `-t` short versions are still present, though. Checked with PG11. – demisx Aug 23 '19 at 15:47
  • `--inserts` is another option; it restores slightly faster but can't tolerate column order changes – Andy Mar 29 '20 at 05:46
  • You can check postgres version by running the query `SELECT version();` – Tms91 Feb 10 '22 at 09:49
45

If you want to DUMP your inserts into an .sql file:

  1. cd to the location which you want to .sql file to be located
  2. pg_dump --column-inserts --data-only --table=<table> <database> > my_dump.sql

Note the > my_dump.sql command. This will put everything into a sql file named my_dump

James111
  • 14,108
  • 14
  • 74
  • 116
6

just in case you are using a remote access and want to dump all database data, you can use:

pg_dump -a -h your_host -U your_user -W -Fc your_database > DATA.dump

it will create a dump with all database data and use

pg_restore -a -h your_host -U your_user -W -Fc your_database < DATA.dump

to insert the same data in your data base considering you have the same structure

Lenon Tolfo
  • 301
  • 2
  • 7
3

Put into a script I like something like that:

#!/bin/bash
set -o xtrace # remove me after debug
TABLE=some_table_name
DB_NAME=prod_database

BASE_DIR=/var/backups/someDir
LOCATION="${BASE_DIR}/myApp_$(date +%Y%m%d_%H%M%S)"
FNAME="${LOCATION}_${DB_NAME}_${TABLE}.sql"

# Create backups directory if not exists
if [[ ! -e $BASE_DIR ]];then
       mkdir $BASE_DIR
       chown -R postgres:postgres $BASE_DIR
fi

sudo -H -u postgres pg_dump --column-inserts --data-only --table=$TABLE $DB_NAME > $FNAME
sudo gzip $FNAME
Pipo
  • 4,013
  • 36
  • 39
1

for postgres 12, this worked for me:

pg_dump -d <database> -t <table> > DATA.dump
suhailvs
  • 17,521
  • 10
  • 95
  • 95