3

基于这个问题,我正在尝试使用 fabric 命令删除我的 postgresql 数据库中的所有表。我试图运行的 bash 命令是

#!/bin/bash
TABLES=`psql $PGDB -t --command "SELECT string_agg(table_name, ',') FROM information_schema.tables WHERE table_schema='public'"`

echo Dropping tables:${TABLES}
psql $PGDB --command "DROP TABLE IF EXISTS ${TABLES} CASCADE"

在我的 fab 脚本中变成:

def delete_tables():
    the_command = "SELECT string_agg(table_name, ',') FROM information_schema.tables WHERE table_schema='public'"
    run("TABLES=`psql -U db_user -d db_name $PGDB -t --command %s`" % the_command)

但错误是,Peer authentication failed for user "string_agg"。这似乎表明该命令不被视为“”之间的命令,而是一个长的单个字符串......

我试过转换: ''\'' ,但没有运气。欢迎任何建议。

4

3 回答 3

6

用于pipes.quote()引用进入 shell 的内容。

import pipes
def delete_tables():
    the_command = "SELECT string_agg(table_name, ',') FROM information_schema.tables WHERE table_schema='public'"
    run("TABLES=`psql -U db_user -d db_name $PGDB -t --command %s`" % pipes.quote(the_command))
于 2013-03-25T11:52:01.253 回答
4

不要为这种任务掏腰包。改用psycopg

import psycopg2

conn = psycopg2.connect(database='db_name', user='db_user')
cur  = conn.cursor()
cur.execute("SELECT string_agg(table_name, ',') FROM ...;")
for record in cur:
    print record
于 2013-03-25T12:23:05.667 回答
0

这应该可以在不需要任何其他导入的情况下工作:

def delete_tables():
run('''psql -U db_user -d db_name $PGDB -t -c "SELECT string_agg(table_name, ',') FROM information_schema.tables WHERE table_schema='public';"''')
于 2018-04-12T18:31:00.690 回答