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()シェルに行く何かを引用するために使用します。

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 に答える