当前位置: 首页 > 面试题库 >

更改迁移中的自动​​增量值(PostgreSQL和SQLite3)

狄宇
2023-03-14
问题内容

我在Heroku上托管了一个项目,想更改表的自动增量起始值。我在本地使用SQLite3,而Heroku使用PostgreSQL这是我在迁移中所拥有的:

class CreateMytable < ActiveRecord::Migration

  def self.up
    create_table :mytable do |t|
      t.text :mytext
    end

    case ActiveRecord::Base.connection.adapter_name 
      when 'PostgreSQL'
        execute 'ALTER SEQUENCE mytable_id_seq RESTART WITH 1000;'
      when 'SQLite'
        execute 'update sqlite_sequence set seq = 1000 where name = "mytable";'
      else
    end 
  end

  def self.down
    drop_table :mytable
  end
end

迁移在本地运行,但SQLite似乎只是忽略更改,尽管它在Heroku上有效。我究竟做错了什么?


问题答案:

老实说,听起来这并不属于迁移。但是,您可以将以下内容添加到初始化程序中,以使其成为方便的基类方法以作为任务的一部分进行调用:

ActiveRecord::Base.class_eval do
  def self.reset_autoincrement(options={})
    options[:to] ||= 1
    case self.connection.adapter_name
      when 'MySQL'
        self.connection.execute "ALTER TABLE #{self.table_name} AUTO_INCREMENT=#{options[:to]}"
      when 'PostgreSQL'
        self.connection.execute "ALTER SEQUENCE #{self.table_name}_id_seq RESTART WITH #{options[:to]};"
      when 'SQLite'
        self.connection.execute "UPDATE sqlite_sequence SET seq=#{options[:to]} WHERE name='#{self.table_name}';"
      else
    end
  end
end

然后,只需将以下内容作为任务的一部分运行,或者直接在控制台中运行:

Mytable.reset_autoincrement(:to => 1000)

确保检查此方便的答案,以了解为什么sqlite无法正常工作。

SQLite重置主键字段



 类似资料:
  • SQLAlchemy变更日志和迁移指南现在集成在主文档中。 当前迁移指南 SQLAlchemy 1.4有什么新功能? SQLAlchemy 2.0概述和状态 迁移到Alchemy 更改日志 1.4变更日志 1.3换热器 1.2换热器 1.1换热器 1换热器 0.9换热器 0.8换热器 0.7换热器 0.6换热器 0.5换热器 0.4换热器 0.3换热器 0.2换热器 0.1换热器 旧的迁移指南 S

  • 我有一个已经分配了默认值的表。例如,我们可以查看以下内容: 现在我想更改活动字段的默认值。我期待着做这样的事情: 但它当然告诉我专栏已经在那里了。如何简单地更新x列的默认值而不删除该列?

  • 如何在Laravel迁移和存在表中添加列自动增量,但不是主键,它的主键是。我使用Laravel 5.7和pgsql。

  • The migration CLI automatically migrates your v1 website to a v2 website. info Manual work is still required after using the migration CLI, as we can't automate a full migration The migration CLI migr

  • 问题内容: 我正在尝试学习一些Flask,并且正在使用Flask-Migrate 1.6.0 所以我做了一个看起来像这样的模型 然后我将其更改为完全相同的东西,除了这一行: 当我运行我的 命令,它不会检测列类型的更改。我已经阅读了它,我知道当我更改env.py并添加compare_type = True变量时,它应该将其选中。但是我这样做无济于事,该方法现在看起来像这样 好的,所以我的问题是: 更

  • 问题内容: 使用MS SQL Server,以下工作正常: 但是,使用PostgreSQL,以下操作将失败: 错误:重复的键值违反了唯一约束“ tbl_test_pkey”详细信息:键(testkey)=(2)已存在。 我需要在一个表中增加一列的每个值,这是复合唯一约束的一部分。如何在一份声明中做到这一点? 谢谢 ! 编辑:如果您想知道为什么这样做(至少对我而言),那么这是一个更完整的方案。 我有