如何删除所有表中的所有内容而不删除数据库

时间:2012-11-13 10:42:22

标签: ruby-on-rails ruby database postgresql activerecord

  

可能重复:
  Truncating all tables in a postgres database

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

4 个答案:

答案 0 :(得分:5)

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

connection = ActiveRecord::Base.connection
connection.tables.each{|t| connection.execute "TRUNCATE #{t}"}

答案 1 :(得分:5)

使用DatabaseCleaner gem。

DatabaseCleaner.strategy = :truncation
DatabaseCleaner.clean

如果你绝对必须在rake任务中使用它,只需将它自己包装成一个。

答案 2 :(得分:2)

用于临时使用

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

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$;

PostgreSQL 9.0引入了DO command。您将创建一个plpgsql函数并为旧版本执行它。

与密切相关的问题进行比较:Truncating all tables in a Postgres database

重复使用

用你的vanilla结构和所有空表创建一个“模板”数据库(让它命名为my_template)可能更简单(也更快!)。然后进行DROP / CREATE DATABASE周期:

DROP DATABASE mydb;
CREATE DATABASE mydb TEMPLATE my_template;

非常快,因为PostgreSQL在文件级别复制整个结构。没有并发问题或其他开销会让您失望。

答案 3 :(得分: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