如果不存在则创建一个表;否则重新填充它

时间:2015-06-26 21:30:46

标签: python postgresql postgis

在python脚本中,一个表被删除并重新创建,但是如果该表不存在则我注意到它会出错。

shp2pgsql = r"shp2pgsql -s 4135 -d "+path+" asmithe.bigtable "
psql = 'psql -U asmithe -h example.org -d xyz -c "ANALYZE asmithe.bigtable"' 
subprocess.Popen(shp2pgsql +" | "+psql, shell=True).wait()

给出

ERROR:  relation "asmithe.bigtable" does not exist

如何保护它以便如果表不存在则只创建它?

2 个答案:

答案 0 :(得分:0)

-c标志指示psql仅 使用-c之后的字符串作为命令。 为了证明:

#!/bin/sh

    # This one fails; the pipe is never read
echo 'create TABLE omg (wtf integer NOT NULL);' \
     | psql -U postgres -d postgres -c 'ANALYZE public.omg;'

    # this one works; *only* the pipe (stdin) is read and executed
echo 'CREATE TABLE omg (wtf integer NOT NULL); ANALYZE public.omg; DROP TABLE public.omg;' \
     | psql -U postgres -d postgres

答案 1 :(得分:0)

正如在另一个答案中所说,-c选项导致psql无法读取管道。 为什么执行ANALYZE?在这个地方是错的。只需删除它:

shp2pgsql = r"shp2pgsql -s 4135 -d "+path+" asmithe.bigtable "
psql = 'psql -U asmithe -h example.org -d xyz' 
subprocess.Popen(shp2pgsql +" | "+psql, shell=True).wait()