4

可能重复:
截断 postgres 数据库中的所有表

如何在不删除数据库的情况下从所有表中删除所有数据?

4

4 回答 4

5

您可以使用原始连接对象来执行 SQL 语句:

connection = ActiveRecord::Base.connection
connection.tables.each{|t| connection.execute "TRUNCATE #{t}"}
于 2012-11-13T10:47:39.470 回答
5

使用DatabaseCleaner gem。

DatabaseCleaner.strategy = :truncation
DatabaseCleaner.clean

如果您绝对必须在 rake 任务中包含此内容,请自己将其打包。

于 2012-11-13T16:19:28.257 回答
2

临时使用

在数据库中运行此语句(小心!核对所有数据!):

DO
$func$
BEGIN
   EXECUTE (
      SELECT 'TRUNCATE TABLE '
             || string_agg(quote_ident(t.tablename), ', ')
             || ' CASCADE'
      FROM   pg_tables t
      WHERE  t.schemaname = 'public' -- assuming default schema
   );
END
$func$;

DO命令是在 PostgreSQL 9.0 中引入的。您将创建一个 plpgsql 函数并为旧版本执行它。

与密切相关的问题进行比较:截断 Postgres 数据库中的所有表

重复使用

my_template使用您的 vanilla 结构和所有空表创建一个“模板”数据库(让我们命名它)可能更简单(而且更快!) 。然后经过一个DROP/CREATE DATABASE循环:

DROP DATABASE mydb;
CREATE DATABASE mydb TEMPLATE my_template;

这是非常快的,因为 PostgreSQL 在文件级别复制整个结构。没有并发问题或其他开销减慢您的速度。

于 2012-11-13T11:03:08.550 回答
1

您可以使用 pg_dump 对数据库进行备份,并使用 pg_resotre --schema-only 仅恢复数据库的模式,它会删除所有表中的所有数据。

示例:

要备份。

pg_dump --format=c --compress=0  -h localhost  mydatabasename > mydump.dmp

只恢复没有数据的模式信息。

pg_restore -c --schema-only mydump.dmp | psql  -h localhost   mydatabasename 
于 2012-11-13T11:47:18.587 回答