PostgreSQL Sequence Updates
I had a problem with PostgreSQL pgdump recently. My setval() calls were all set to '1'.
I wrote this script to fix things:
#!/usr/bin/env python
DB_NAME = 'my_db'
from subprocess import Popen, PIPE
import re
exclude = [ 'tablename', 'rows' ]
tp = re.compile( '[^a-z_]' )
query = (
"-c SELECT tablename FROM pg_tables "
"WHERE tablename NOT LIKE 'pg_%' "
"AND tablename NOT LIKE 'sql_%' "
"ORDER BY tablename"
)
ts = Popen(
[ "/usr/bin/psql", DB_NAME, query ],
stdout=PIPE
).communicate()[ 0 ].split( ' ' )
tables = []
for t in ts:
t = tp.sub( '', t )
if len( t ) == 0 or t in exclude:
continue
tables.append( t )
for t in tables:
sql = (
"SELECT pg_catalog.setval( "
"pg_get_serial_sequence( '%s', 'id' ), "
"( SELECT MAX( id ) FROM %s ) + 1 );"
) % ( t, t )
print Popen(
[ "/usr/bin/psql", DB_NAME, "-c %s" % sql ],
stdout=PIPE
).communicate()[ 0 ]