postgresql - example - tables postgres
¿Deseas eliminar todas las tablas en PostgreSQL? (19)
Bueno, ya que me gusta trabajar desde la línea de comandos ...
psql -U <user> -d <mydb> -c ''/dt'' | cut -d '' '' -f 4 | sed -e "s/^/drop table if exists /" | sed -e "s/$/;/"
-c ''/dt''
invocará el comando de tablas de listas.
List of relations Schema | Name | Type | Owner --------+-------------------+-------+---------- public | _d_psidxddlparm | table | djuser public | _d_psindexdefn | table | djuser
cut -d '' '' -f 4
ahora, canalice su salida para tomar el 4to campo (cuando use el espacio como separador), que es la tabla.
sed
se usa entonces para prefijar una drop table
y el sufijo ;
separador de comandos.
| egrep ''_d_''
| egrep ''_d_''
: | egrep ''_d_''
en grep
poco más y puede ser más selectivo sobre las tablas que suelta.
drop table if exists _d_psidxddlparm; drop table if exists _d_psindexdefn;
Nota: como está escrito, esto generará filas falsas para la salida de los comandos /dt
de los encabezados de columna y las filas totales al final. Evito eso al grepping, pero podrías usar head
y tail
.
¿Cómo puedo eliminar todas las tablas en PostgreSQL, trabajando desde la línea de comandos?
No quiero eliminar la base de datos, solo todas las tablas y todos los datos que contienen.
De acuerdo con Pablo arriba, para simplemente abandonar un esquema específico, con respecto al caso:
select ''drop table "'' || tablename || ''" cascade;''
from pg_tables where schemaname = ''public'';
La respuesta más aceptada a partir de este escrito (enero de 2014) es:
drop schema public cascade;
create schema public;
Esto funciona, sin embargo, si su intención es restaurar el esquema público a su estado virgen, esto no cumple completamente la tarea. En pgAdmin III para PostgreSQL 9.3.1, si hace clic en el esquema "público" creado de esta manera y mira en el "panel SQL" verá lo siguiente:
-- Schema: public
-- DROP SCHEMA public;
CREATE SCHEMA public
AUTHORIZATION postgres;
Sin embargo, en contraste, una nueva base de datos tendrá lo siguiente:
-- Schema: public
-- DROP SCHEMA public;
CREATE SCHEMA public
AUTHORIZATION postgres;
GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO public;
COMMENT ON SCHEMA public
IS ''standard public schema'';
Para mí, usar un marco web de Python que crea tablas de base de datos (web2py), usando los problemas causados anteriormente:
<class ''psycopg2.ProgrammingError''> no schema has been selected to create in
Entonces, en mi opinión, la respuesta correcta es:
DROP SCHEMA public CASCADE;
CREATE SCHEMA public;
GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO public;
COMMENT ON SCHEMA public IS ''standard public schema'';
(También tenga en cuenta que para emitir estos comandos desde pgAdmin III, fui a Plugins-> PSQL Console)
Mejoré el método de bash de jamie cuidando las vistas porque solo respeta el tipo de tabla "tabla base", que es el valor predeterminado.
El siguiente código de bash elimina primero las vistas y luego todas las demás.
#!/usr/bin/env bash
PGDB="yourDB"
# By exporting user & pass your dont need to interactively type them on execution
export PGUSER="PGusername"
export PGPASSWORD="PGpassword"
VIEWS=`psql -d $PGDB -t --command "SELECT string_agg(table_name, '','') FROM information_schema.tables WHERE table_schema=''public'' AND table_type=''VIEW''"`
BASETBLS=`psql -d $PGDB -t --command "SELECT string_agg(table_name, '','') FROM information_schema.tables WHERE table_schema=''public'' AND table_type=''BASE TABLE''"`
echo Dropping views:${VIEWS}
psql $PGDB --command "DROP VIEW IF EXISTS ${VIEWS} CASCADE"
echo Dropping tables:${BASETBLS}
psql $PGDB --command "DROP TABLE IF EXISTS ${BASETBLS} CASCADE"
Modifiqué ligeramente la respuesta de Pablo por la conveniencia de tener los comandos SQL generados como una sola cadena:
select string_agg(''drop table "'' || tablename || ''" cascade'', ''; '')
from pg_tables where schemaname = ''public''
Necesitas eliminar tablas y secuencias, esto es lo que funcionó para mí.
psql -qAtX -c "select ''DROP TABLE IF EXISTS '' || quote_ident(table_schema) || ''.'' || quote_ident(table_name) || '' CASCADE;'' FROM information_schema.tables where table_type = ''BASE TABLE'' and not table_schema ~ ''^(information_schema|pg_.*)$''" | psql -qAtX
psql -qAtX -c "select ''DROP SEQUENCE IF EXISTS '' || quote_ident(relname) || '' CASCADE;'' from pg_statio_user_sequences;" | psql -qAtX
antes de ejecutar el comando, es posible que necesite sudo / su para el usuario postgres
o (exportar detalles de conexión PGHOST
, PGPORT
, PGUSER
y PGPASSWORD
) y luego export PGDATABASE=yourdatabase
Por si acaso ... Sencillo script Python que limpia la base de datos Postgresql
import psycopg2
import sys
# Drop all tables from a given database
try:
conn = psycopg2.connect("dbname=''akcja_miasto'' user=''postgres'' password=''postgres''")
conn.set_isolation_level(0)
except:
print "Unable to connect to the database."
cur = conn.cursor()
try:
cur.execute("SELECT table_schema,table_name FROM information_schema.tables WHERE table_schema = ''public'' ORDER BY table_schema,table_name")
rows = cur.fetchall()
for row in rows:
print "dropping table: ", row[1]
cur.execute("drop table " + row[1] + " cascade")
cur.close()
conn.close()
except:
print "Error: ", sys.exc_info()[1]
Asegúrese de que, después de copiarlo, la sangría sea la correcta, ya que Python se basa en ella.
Puede usar la función string_agg para hacer una lista separada por comas, perfecta para DROP TABLE. De un guión de 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"
Puedes caer todas las mesas con
DO $$ DECLARE
r RECORD;
BEGIN
-- if the schema you operate on is not "current", you will want to
-- replace current_schema() in query with ''schematodeletetablesfrom''
-- *and* update the generate ''DROP...'' accordingly.
FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = current_schema()) LOOP
EXECUTE ''DROP TABLE IF EXISTS '' || quote_ident(r.tablename) || '' CASCADE'';
END LOOP;
END $$;
En mi opinión, esto es mejor que drop schema public
, ya que no es necesario volver a crear el schema
y restaurar todas las concesiones.
Bonificación adicional de que esto no requiere lenguaje de scripting externo, ni copiar y pegar de nuevo el SQL generado al intérprete.
Puedes escribir una consulta para generar un script SQL como este:
select ''drop table "'' || tablename || ''" cascade;'' from pg_tables;
O:
select ''drop table if exists "'' || tablename || ''" cascade;'' from pg_tables;
En caso de que algunas tablas se eliminen automáticamente debido a la opción de cascada en una oración anterior.
Además, como se indica en los comentarios, es posible que desee filtrar las tablas que desea colocar por nombre de esquema:
select ''drop table if exists "'' || tablename || ''" cascade;''
from pg_tables
where schemaname = ''public''; -- or any other schema
Y luego ejecutarlo.
La gloriosa COPY + PASTE también funcionará.
Rake task for Rails para destruir todas las tablas en la base de datos actual
namespace :db do
# rake db:drop_all_tables
task drop_all_tables: :environment do
query = <<-QUERY
SELECT
table_name
FROM
information_schema.tables
WHERE
table_type = ''BASE TABLE''
AND
table_schema NOT IN (''pg_catalog'', ''information_schema'');
QUERY
connection = ActiveRecord::Base.connection
results = connection.execute query
tables = results.map do |line|
table_name = line[''table_name'']
end.join ", "
connection.execute "DROP TABLE IF EXISTS #{ tables } CASCADE;"
end
end
Si desea eliminar datos (no borrar tabla):
-- Truncate tables and restart sequnces
SELECT ''TRUNCATE TABLE "'' || table_schema || ''"."'' || table_name || ''" RESTART IDENTITY CASCADE;''
FROM information_schema.tables
WHERE table_catalog = ''<database>'' AND table_schema = ''<schema>'';
O si quieres drop table puedes usar este sql:
-- For tables
SELECT ''DROP TABLE "'' || table_schema || ''"."'' || table_name || ''" CASCADE;''
FROM information_schema.tables
WHERE table_catalog = ''<database>'' AND table_schema = ''<schema>'';
-- For sequences
SELECT ''DROP SEQUENCE d_a_seq "'' || sequence_schema || ''"."'' || sequence_name || ''";''
FROM information_schema.sequences
WHERE sequence_catalog = ''<database>'' AND sequence_schema = ''<schema>'';
Si tiene installed lenguaje de procedimientos PL / PGSQL, puede usar lo siguiente para eliminar todo sin un script shell / Perl externo.
DROP FUNCTION IF EXISTS remove_all();
CREATE FUNCTION remove_all() RETURNS void AS $$
DECLARE
rec RECORD;
cmd text;
BEGIN
cmd := '''';
FOR rec IN SELECT
''DROP SEQUENCE '' || quote_ident(n.nspname) || ''.''
|| quote_ident(c.relname) || '' CASCADE;'' AS name
FROM
pg_catalog.pg_class AS c
LEFT JOIN
pg_catalog.pg_namespace AS n
ON
n.oid = c.relnamespace
WHERE
relkind = ''S'' AND
n.nspname NOT IN (''pg_catalog'', ''pg_toast'') AND
pg_catalog.pg_table_is_visible(c.oid)
LOOP
cmd := cmd || rec.name;
END LOOP;
FOR rec IN SELECT
''DROP TABLE '' || quote_ident(n.nspname) || ''.''
|| quote_ident(c.relname) || '' CASCADE;'' AS name
FROM
pg_catalog.pg_class AS c
LEFT JOIN
pg_catalog.pg_namespace AS n
ON
n.oid = c.relnamespace WHERE relkind = ''r'' AND
n.nspname NOT IN (''pg_catalog'', ''pg_toast'') AND
pg_catalog.pg_table_is_visible(c.oid)
LOOP
cmd := cmd || rec.name;
END LOOP;
FOR rec IN SELECT
''DROP FUNCTION '' || quote_ident(ns.nspname) || ''.''
|| quote_ident(proname) || ''('' || oidvectortypes(proargtypes)
|| '');'' AS name
FROM
pg_proc
INNER JOIN
pg_namespace ns
ON
(pg_proc.pronamespace = ns.oid)
WHERE
ns.nspname =
''public''
ORDER BY
proname
LOOP
cmd := cmd || rec.name;
END LOOP;
EXECUTE cmd;
RETURN;
END;
$$ LANGUAGE plpgsql;
SELECT remove_all();
En lugar de escribir esto en el mensaje "psql", le sugiero que lo copie en un archivo y luego pase el archivo como entrada a psql usando las opciones "--file" o "-f":
psql -f clean_all_pg.sql
Crédito al que se debe el crédito: escribí la función, pero creo que las consultas (o la primera al menos) provinieron de alguien en una de las listas de correo de pgsql hace años. No recuerdo exactamente cuándo o cuál.
Si todas sus tablas están en un solo esquema, este enfoque podría funcionar (el código a continuación asume que el nombre de su esquema es public
)
DROP SCHEMA public CASCADE;
CREATE SCHEMA public;
Si está utilizando PostgreSQL 9.3 o superior, es posible que también deba restaurar las concesiones predeterminadas.
GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO public;
Si todo lo que quieres soltar es propiedad del mismo usuario, entonces puedes usar:
drop owned by the_user;
Esto eliminará todo lo que el usuario posee.
Eso incluye vistas materializadas, vistas, secuencias, disparadores, esquemas, funciones, tipos, agregados, operadores, dominios, etc. (así, realmente: todo ) que posee el the_user
(= creado).
the_user
reemplazar the_user
con el nombre de usuario real, actualmente no hay opción para dejar todo para "el usuario actual". La próxima versión 9.5 tendrá la opción drop owned by current_user
.
Más detalles en el manual: http://www.postgresql.org/docs/current/static/sql-drop-owned.html
Siguiendo a Pablo y LenW, aquí hay una sola línea que hace todo preparando y luego ejecutando:
psql -U $PGUSER $PGDB -t -c "select ''drop table /"'' || tablename || ''/" cascade;'' from pg_tables where schemaname = ''public''" | psql -U $PGUSER $PGDB
NB: configure o reemplace $PGUSER
y $PGDB
con los valores que desee
Utilice este script en pgAdmin:
DO $$
DECLARE
brow record;
BEGIN
FOR brow IN (select ''drop table "'' || tablename || ''" cascade;'' as table_name from pg_tables where schemaname = ''public'') LOOP
EXECUTE brow.table_name;
END LOOP;
END; $$
en un archivo por lotes de Windows:
@echo off
FOR /f "tokens=2 delims=|" %%G IN (''psql --host localhost --username postgres --command="/dt" YOUR_TABLE_NAME'') DO (
psql --host localhost --username postgres --command="DROP table if exists %%G cascade" sfkb
echo table %%G dropped
)
drop schema public cascade;
debe hacer el truco