在 postgres 中恢复 sql 文件时退出代码 1

问题描述 投票:0回答:4

我有一个手动生成的 SQL 文件。我使用下面的代码来创建它。

conn = psycopg2.connect(host=t_host, port=t_port, dbname=t_dbname, user=t_name_user, password=t_password)
cursor = conn.cursor()

table_name='product'  
with open("table_dump.sql","w+") as f:
    create_query ="""CREATE TABLE public.decima
                    (
                        product_name character varying(200) COLLATE pg_catalog."default",
                        product_owner character varying(20) COLLATE pg_catalog."default",
                        trigger_operation character varying(4) COLLATE pg_catalog."default",
                        name character varying(250) COLLATE pg_catalog."default" NOT NULL,
                        CONSTRAINT product_pkey PRIMARY KEY (name)
                    )

                    TABLESPACE pg_default;"""
    f.write('%s \n' % (create_query))  
    #select table query
    cursor.execute("SELECT * FROM %s" % (table_name)) 
    column_names = []
    columns_descr = cursor.description
    for c in columns_descr:
        column_names.append(c[0])
    #insert query (insert data)
    insert_prefix = 'INSERT INTO %s (%s) VALUES ' % (table_name, ', '.join(column_names))
    rows = cursor.fetchall()
    for row in rows:
        row_data = []
        for rd in row:
            if rd is None:
                row_data.append('NULL')
            elif isinstance(rd, datetime.datetime):
                row_data.append("'%s'" % (rd.strftime('%Y-%m-%d %H:%M:%S') ))
            else:
                row_data.append(repr(rd))
        f.write('%s (%s);\n' % (insert_prefix, ', '.join(row_data)))  

当我使用“table_dump.sql”恢复数据库时,出现退出代码。但是我作为查询执行了这个文件,然后我的数据库仍然被创建并照常工作。 那么如何解决这个问题呢。谢谢。 这是我尝试恢复的方式 这是错误的详细信息

python-3.x postgresql restore pgadmin-4 pg-restore
4个回答
1
投票

恢复选项不适用于 sql 格式的文件。 (我不知道为什么 PgAdmin4 在文件选择器中提供“sql”作为扩展名,这可能是一个错误)。恢复选项是针对 pg_dump 可以生成的非纯文件格式而设计的。

您使用的是旧版本的 PgAdmin4,它会丢失 pg_restore 的错误消息。如果您将其升级到最新版本,您将看到错误消息

pg_restore: error: input file does not appear to be a valid archive

但是问题出在哪里呢?您说将其作为脚本运行是有效的。所以就这么做吧。


0
投票

选择格式“自定义或 tar”并浏览其他字段中的文件名。 然后您可以在浏览窗口中选择sql。 也许您选择“格式”作为“目录”。这是我犯的同样的错误。


0
投票

这可能不是一个解决方案,但就我而言,当我尝试在 pgAdmin 4 中一一恢复模式时,我遇到了同样的问题。但是当我检查所有数据都存在时。看起来这是一个错误,在执行结束时显示。

您可以使用下面的查询来检查源数据库的大小以及当前恢复目标的位置。

SELECT schema_name, 
       pg_size_pretty(sum(table_size)::bigint),
       (sum(table_size) / pg_database_size(current_database())) * 100
FROM (
  SELECT pg_catalog.pg_namespace.nspname as schema_name,
         pg_relation_size(pg_catalog.pg_class.oid) as table_size
  FROM   pg_catalog.pg_class
     JOIN pg_catalog.pg_namespace ON relnamespace = pg_catalog.pg_namespace.oid
) t
GROUP BY schema_name
ORDER BY schema_name

0
投票

我也遇到了类似的错误,退出代码为 1:-

通过在架构级别而不是数据库级别执行恢复选项来恢复数据来解决这个问题

© www.soinside.com 2019 - 2024. All rights reserved.