【问题标题】:Is there a way to stop increasing the auto increment value in mysql when running specs?有没有办法在运行规范时停止增加 mysql 中的自动增量值?
【发布时间】:2016-07-12 20:29:55
【问题描述】:

我有大约 100 个规格,在我目前正在开发的 Sinatra 项目中。 为了测试,我目前正在使用 rspec + DatabaseCleaner 和 :transaction 策略。

其中一些规范需要在数据库中创建新记录,因此它们会增加 mysql 中的自动增量表值。有没有一种方法可以使用事务策略运行我的测试,而无需使用 DatabaseCleaner 或其他 gem 增加自动增量值?

编辑:我希望 auto_increment 具有测试运行之前的值。

【问题讨论】:

  • 你希望在你的 auto_increment 列中有什么值....
  • @ZafarMalik 测试运行前的值。
  • 如果您在 auto_increment 列中传递自己的 id,那么它将采用您自己传递的值而不是 auto_id...所以您不必担心...但请确保 id表中不应该存在...如果您想说别的,请清除。
  • @ZafarMalik 我没有将 ID 传递给 auto_increment。当我的测试运行时,其中一些将记录插入数据库,然后将它们删除,但是 auto_increment 值不会回滚。

标签: mysql ruby rspec sinatra datamapper


【解决方案1】:

我假设在测试时不会从生产或外部测试插入任何记录。

首先通过以下命令从您的表中获取最后一个 auto_id-

select max(id) from mytable;

假设是 240125

现在开始你的测试,完成后你的测试按照下面做-

先删除所有新创建的auto_ids-

delete from mytable where id>240125;

现在从这个位置设置 auto_increment。

alter table mytable AUTO_INCREMENT=240126;

【讨论】:

  • 这看起来不错。有没有办法只对有插入的表进行?
  • 因为您可以在表级别设置 auto_increment 值,所以它取决于您要为哪个表重置 auto_increment ....在您的情况下...您可以找到您认为插入的表完成....您还可以通过存储过程自动执行此过程,假设在测试之前将最大 auto_id 保存在临时表中...然后在测试后存储相同的 id...并比较第 2 次 id > 第 1 次存储 id 的位置然后删除超过第 1 次的所有记录仅插入第 2 次 id > 第 1 次 id 并重置 auto_increment id = 第 1 次保存 id + 1.... 的表
【解决方案2】:

测试后将值重置为某个已知值。看看这里...

How to reset AUTO_INCREMENT in MySQL?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    • 2010-09-30
    • 1970-01-01
    • 1970-01-01
    • 2022-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多