¿Cómo puedo colocar todas las tablas en PostgreSQL, trabajando desde la línea de comandos?
Yo no quiero caer la propia base de datos, a todas las tablas y todos los datos en ellos.
postgresql
AP257
fuente
fuente
public
, pierdes las extensiones instaladas.Respuestas:
Si todas sus tablas están en un solo esquema, este enfoque podría funcionar (el código siguiente supone que el nombre de su esquema es
public
)Si está utilizando PostgreSQL 9.3 o superior, es posible que también deba restaurar las concesiones predeterminadas.
fuente
pg_
) ya que están en un esquema diferente,pg_catalog
.GRANT ALL ON SCHEMA public TO public;
después de la creación.GRANT ALL
después de crear?Puede escribir una consulta para generar un script SQL como este:
O:
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:
Y luego ejecútalo.
Glorious COPY + PASTE también funcionará.
fuente
drop schema public cascade;
, pero casi siempre tienes los permisos para soltar tablas.La respuesta más aceptada a partir de este escrito (enero de 2014) es:
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 busca en el "panel SQL", verá lo siguiente:
Sin embargo, por el contrario, una nueva base de datos tendrá lo siguiente:
Para mí, usar un marco web de Python que crea tablas de base de datos (web2py), usando los problemas anteriores:
Entonces, en mi opinión, la respuesta correcta es:
También tenga en cuenta que para emitir estos comandos en pgAdmin III, utilicé la herramienta de consulta (icono de lupa "Ejecutar consultas SQL abritrarias") o podría usar Plugins-> Consola PSQL
Nota
Si tiene alguna extensión instalada, se eliminarán cuando elimine el esquema, por lo que debe tomar nota de lo que necesita instalar y luego ejecutar las declaraciones según sea necesario. P.ej
CREATE EXTENSION postgis;
fuente
drop
entoncescreate
) solía funcionar en PostgreSQL 9.1. Después de actualizar a 9.3, los dos adicionalesgrant
son necesarios.Puede soltar todas las tablas con
OMI, esto es mejor que
drop schema public
, porque no es necesario volver a crearschema
y restaurar todas las subvenciones.Una ventaja adicional de que esto no requiere lenguaje de secuencias de comandos externo, ni copiar y pegar el SQL generado al intérprete.
fuente
drop schema
truco ya que el usuario no era dueño del esquema, solo de las tablas. Aunque funcionó :)EXECUTE 'DROP TABLE IF EXISTS ' || quote_ident(r.tablename) || ' CASCADE';
con esto:EXECUTE format('DROP TABLE IF EXISTS %I CASCADE', quote_ident(r.tablename));
Si todo lo que desea soltar es propiedad del mismo usuario, puede usar:
Esto eliminará todo lo que posee el usuario.
Eso incluye vistas materializadas, vistas, secuencias, disparadores, esquemas, funciones, tipos, agregados, operadores, dominios, etc. (así, realmente: todo ) que
the_user
posee (= creado).Debe reemplazarlo
the_user
con el nombre de usuario real, actualmente no hay opción para soltar todo para "el usuario actual". La próxima versión 9.5 tendrá la opcióndrop owned by current_user
.Más detalles en el manual: http://www.postgresql.org/docs/current/static/sql-drop-owned.html
fuente
public
esquema son propiedadpostgres
, pero todo lo demás es propiedad de un usuario específico, por lo que descartar todo lo que posee ese usuario borra la base de datos, excepto el esquema.Según Pablo arriba, para caer de un esquema específico, con respecto al caso:
fuente
where schemaname='public'
parte es significativa?debería hacer el truco.
fuente
CREATE SCHEMA public;
. También consulte stackoverflow.com/a/14286370 para obtener más informaciónSiguiendo a Pablo y LenW, aquí hay una frase que lo prepara todo y luego lo ejecuta:
psql -U $PGUSER $PGDB -t -c "select 'drop table \"' || tablename || '\" cascade;' from pg_tables where schemaname = 'public'" | psql -U $PGUSER $PGDB
NB: establezca o reemplace
$PGUSER
y$PGDB
con los valores que deseefuente
Si tiene instalado el lenguaje de procedimiento PL / PGSQL, puede usar lo siguiente para eliminar todo sin un script externo de shell / Perl.
En lugar de escribir esto en el indicador "psql", le sugiero que lo copie en un archivo y luego pase el archivo como entrada a psql usando las opciones "--file" o "-f":
Crédito donde es debido: escribí la función, pero creo que las consultas (o al menos la primera) provienen de alguien en una de las listas de correo pgsql hace años. No recuerdo exactamente cuándo o cuál.
fuente
Si de todos modos desea destruir todas las tablas, puede prescindir de detalles como CASCADE colocando todas las tablas en una sola declaración. Esto también hace que la ejecución sea más rápida.
Ejecutándolo directamente:
Reemplace
TRUNCATE
conDROP
según corresponda.fuente
public
esquema, no olvide incluir el nombre del esquema en la expresión: enstring_agg(quote_ident(schemaname) || '.' || quote_ident(tablename), ', ')
lugar de simplemente pasar los nombres de las tablas.Modifiqué ligeramente la respuesta de Pablo para la conveniencia de que los comandos SQL generados se devuelvan como una sola cadena:
fuente
Use este script en pgAdmin:
fuente
Por si acaso ... Script Python simple que limpia la base de datos Postgresql
Asegúrese de que después de copiarlo, la sangría sea correcta ya que Python se basa en ella.
fuente
Puede usar la función string_agg para hacer una lista separada por comas, perfecta para DROP TABLE. De un script bash:
fuente
Esta es una pregunta realmente interesante, y la harás de varias maneras. Espero que esto te sea útil.
Aquí, en general, tenemos un
public
esquema por defecto. Entonces, lo estoy usando como una instancia.Si está utilizando PostgreSQL 9.3 o superior, es posible que también deba restaurar las concesiones predeterminadas.
Esto limpiará un esquema completo y lo volverá a crear como uno nuevo.
Si no se pierden otras entidades también, como
Functions
,Views
,Materialized views
, etc.PostgreSQL almacena todas las tablas en su tabla de registro denominada
pg_table
.Como puede ver, mediante el uso de subconsultas, podemos eliminar todas las tablas del esquema.
Cuando las otras entidades de datos son importantes y solo desea eliminar solo las tablas del esquema, este enfoque será realmente útil para usted.
fuente
Si desea eliminar datos (no eliminar tabla):
O si desea colocar la tabla puede usar este sql:
fuente
Nota: mi respuesta se trata de eliminar realmente las tablas y otros objetos de la base de datos; para eliminar todos los datos en las tablas, es decir, truncar todas las tablas , Endre Both ha proporcionado una declaración similarmente bien ejecutada (ejecución directa) un mes después.
Para los casos en los que no puede simplemente
DROP SCHEMA public CASCADE;
,DROP OWNED BY current_user;
o algo así, aquí hay un script SQL independiente que escribí, que es seguro para las transacciones (es decir, puede ponerlo entreBEGIN;
yROLLBACK;
para probarlo oCOMMIT;
hacer el acto) y limpia "todos" los objetos de la base de datos ... bueno, todos los que se usan en la base de datos que usa nuestra aplicación o podría agregar con sensatez, que es:CHECK
,UNIQUE
)VIEW
s (normal o materializado)public
los esquemas no predeterminados (es decir, no o internos de la base de datos) que "nosotros" poseemos: el script es útil cuando se ejecuta como "no un superusuario de base de datos"; un superusuario puede descartar todos los esquemas (sin embargo, los realmente importantes aún se excluyen explícitamente)No se descartan (algunos deliberados; otros solo porque no tenía ningún ejemplo en nuestra base de datos):
public
esquema (p. ej. para cosas proporcionadas por la extensión en ellos)Esto es realmente útil para los casos en que el volcado que desea restaurar es de una versión de esquema de base de datos diferente (por ejemplo, con Debian
dbconfig-common
, Flyway o Liquibase / DB-Manul) que la base de datos en la que desea restaurarlo.También tengo una versión que elimina "todo excepto dos tablas y lo que les pertenece" (una secuencia, probada manualmente, lo siento, lo sé, aburrida) en caso de que alguien esté interesado; La diferencia es pequeña. Contáctame o consulta este repositorio si estás interesado.
SQL
Probado, excepto adiciones posteriores (
extensions
contribuido por Clément Prévost ), en PostgreSQL 9.6 (jessie-backports
). Eliminación agregada probada en 9.6 y 12.2, eliminación de procedimiento probada también en 12.2. ¡Correcciones de errores y mejoras adicionales son bienvenidas!fuente
DROP FUNCTION
falla para un procedimiento y viceversa.AND pp.prokind ='f' -- Function
AND pp.prokind ='p' -- Procedure
proisagg
) en ≤ 10.x y agregados y procedimientos (prokind
) en ≥ 11 (verificado dinámicamente) y probé ambos ☻ gracias por la pista.Necesitas soltar tablas y secuencias, esto es lo que funcionó para mí
antes de ejecutar el comando puede que tenga que sudo / Do a los
postgres
usuarios o (conexión de exportación InformaciónPGHOST
,PGPORT
,PGUSER
yPGPASSWORD
) y luegoexport PGDATABASE=yourdatabase
fuente
Rastrillar tarea para Rails para destruir todas las tablas en la base de datos actual
fuente
rake db:create
, lo ejecuto. Usted puede hacer la punta Steve y eliminar el códigotable_name =
y el cambio", "
de","
y#{ tables }
fo#{tables}
Los siguientes pasos pueden ser útiles (para usuarios de Linux):
Al principio ingrese el
postgres
símbolo del sistema mediante el siguiente comando:Ingrese la base de datos con este comando (el nombre de mi base de datos es:)
maoss
:Ahora ingrese el comando para descartar todas las tablas:
fuente
Mejoré el método bash de jamie cuidando las vistas porque solo respeta el tipo de tabla "tabla base", que es el valor predeterminado.
el siguiente código bash elimina las vistas primero y luego todo el resto
fuente
psql -d $PGDB -t --command "SELECT string_agg(sequence_name, ',') FROM information_schema.sequences WHERE sequence_schema='public' AND sequence_catalog='$PGDB'"
en un archivo por lotes de Windows:
fuente
bueno, ya que me gusta trabajar desde la línea de comando ...
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 list tables.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 cuarto campo (cuando use el espacio como separador), que es la tabla.sed
luego se usa para prefijar aydrop table
sufijo el;
separador de comandos.| egrep '_d_'
- Conéctelo ungrep
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
\dt
salida de comandos de encabezados de columna y filas totales al final. Lo evito haciendo grepping, pero podrías usarhead
ytail
.fuente
La forma más fácil es eliminar el esquema público como otros han sugerido en respuestas anteriores. Sin embargo, esta NO es una buena manera. Nunca se sabe lo que se ha hecho al esquema público que desde entonces se ha olvidado y no se documentó. Tampoco sabe si esto funcionará igual en el futuro. En V9, hubiera estado bien, pero en V10 todos sus usuarios perderían el acceso al esquema, y se les debe otorgar acceso nuevamente, de lo contrario su aplicación se romperá. No he comprobado V11, pero el punto es que nunca se sabe qué se romperá a medida que se mueva de máquina a máquina, de sitio a sitio o de versión a versión. Tampoco se puede hacer si es un usuario que tiene acceso a la base de datos, pero no al esquema.
Si necesita hacer esto mediante programación, otras respuestas anteriores cubren esto, pero una cosa que las respuestas anteriores no consideran es hacer que Postgres haga el trabajo por usted. Si usa pg_dump con la opción -c como se muestra a continuación:
Eso creará un script de restauración de base de datos con sentencias sql que eliminará todas las tablas.
Si el único propósito al hacer la pregunta era eliminar las tablas antes de restaurar, entonces su restauración hará el trabajo por usted.
Sin embargo, si lo necesita para otra cosa, simplemente puede copiar las declaraciones de caída del script sql.
fuente