Je dois en quelque sorte convertir un fichier de vidage v10 en un fichier compatible 9.6
Cloud SQL de Google exécute PostgreSQL version 9.6 et ma base de données fonctionne sur la version 10 depuis sa création.
THE ISSUE: Lorsque j'essaie d'importer la base de données dans Cloud SQL, j'obtiens le an unknown error has occurred.
message de mort.
J'ai déjà essayé de commenter mes postgis/autres extensions lors de l'importation dans Cloud SQL mais en vain.
J'ai essayé d'utiliser psql my_96_db < my_10.sql
et obtenez des tonnes d'erreurs comme celle-ci:
...
CREATE TABLE
ERROR: syntax error at or near "AS"
LINE 2: AS integer
^
ERROR: relation "authentication_phonecontact_id_seq" does not exist
CREATE TABLE
...
J'ai essayé d'utiliser pg_restore de postgres 9.6 sur ma v10 pg_dump -Fc
, mais il ne réussira pas à importer dans une base de données 9.6. Un exemple d'une des nombreuses défaillances de la sortie est
pg_restore: [archiver (db)] could not execute query: ERROR: relation "public.authentication_referral_id_seq" does not exist
LINE 1: SELECT pg_catalog.setval('public.authentication_referral_id_...
^
Command was: SELECT pg_catalog.setval('public.authentication_referral_id_seq', 1, false);
À en juger par les messages d'erreur que vous affichez, vous devrez modifier le vidage SQL et supprimer toutes les occurrences de AS integer
de tous CREATE SEQUENCE
déclarations.
Le AS data_type
clause de CREATE SEQUENCE
est nouveau dans PostgreSQL v10, et les anciennes versions de serveur ne le comprendront pas.
Suite à la suggestion de @ "Laurenz Albe", voici un extrait python3 qui peut être utilisé pour rétrograder un script pg_dump 10.x pour 9.x:
#!/usr/bin/env python3
import sys
#
# Downgrades pg_dump 10 script to 9.x
# removing 'AS integer' from 'CREATE SEQUENCE' statement
#
# Usage:
# $ python3 pgdump_10_to_9.py < test10.sql > test9.sql
# or:
# $ cat test10.sql | ./pgdump_10_to_9.py > test9.sql
#
# To obtain a compressed 9.x sql script from a compressed 10 sql script:
#
# $ gunzip -c test10.sql.gz | ./pgdump_10_to_9.py | gzip > test9.sql.gz
#
inside_create_sequence = False
for row in sys.stdin.readlines():
if inside_create_sequence and row.strip().lower() == 'as integer':
pass
else:
print(row, end='', flush=True)
inside_create_sequence = row.strip().startswith('CREATE SEQUENCE ')