如何在不删除数据库的情况下删除所有表中的所有数据?
答案 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