【问题标题】:How to delete everything from all tables without dropping the database [duplicate]如何在不删除数据库的情况下从所有表中删除所有内容[重复]
【发布时间】:2012-11-01 19:06:12
【问题描述】:

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

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

【问题讨论】:

  • 不可能删除表,因为违反了参照完整性。回滚迁移也是不可能的,因为旧迁移与存储的数据兼容。这应该通过仅使用 rake 任务来完成
  • 如果引用完整性受到阻碍,只需将关键字CASCADE 添加到TRUNCATE - 就像被恶魔对待一样。此外,正如@Hck 所展示的,您始终可以执行原始 SQL。将CASCADE 附加到 Hck 的示例或使用我的DO 命令以获得更好的性能。没有理由让框架阻止您获得最佳解决方案。

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


【解决方案1】:

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

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

【讨论】:

  • 不起作用,因为违反了参照完整性cannot truncate a table referenced in a foreign key constraint
  • 所以在截断表之前执行查询以关闭外键检查(对于 MySQL):connection.execute "SET FOREIGN_KEY_CHECKS=0"
【解决方案2】:

使用DatabaseCleaner gem。

DatabaseCleaner.strategy = :truncation
DatabaseCleaner.clean

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

【讨论】:

    【解决方案3】:

    临时使用

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

    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 command 是在 PostgreSQL 9.0 中引入的。您将创建一个 plpgsql 函数并为旧版本执行它。

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

    重复使用

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

    DROP DATABASE mydb;
    CREATE DATABASE mydb TEMPLATE my_template;
    

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

    【讨论】:

    • 这应该只使用 rake 任务来完成
    【解决方案4】:

    您可以使用 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 
    

    【讨论】:

      猜你喜欢
      • 2011-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-09
      • 2019-12-15
      • 1970-01-01
      • 2011-03-22
      相关资源
      最近更新 更多