gpt4 book ai didi

ruby-on-rails - 有没有办法获取迁移的创建表语句

转载 作者:太空宇宙 更新时间:2023-11-03 18:21:30 25 4
gpt4 key购买 nike

我想知道是否有办法获取迁移的创建表语句。因此,除了运行 rake db:migrate,如果你可以编写一些东西来调用迁移而不是向上或向下运行,那么能够运行它而不是创建表,你可以只获取 create table 语句。

类似 Createfootable.up 的东西,如果我想要 SQLite 或 MySQL 等的创建表语句,则能够具体说明。这可能吗?

最佳答案

这是两个不同的问题:

  1. 我可以从迁移中生成一个查询字符串(或一组查询字符串)吗?
  2. 我可以选择在运行迁移(或从中生成查询)时使用哪个适配器吗?

对这两个问题的简短回答是“是的,你可以”。

class CreateFoosTable < ActiveRecord::Migration
def up
create_table :foo do |t|
t.int :bar
t.string :baz
end
end
end

首先要回答第二个问题,您可以通过更改用于建立连接的 ActiveRecord 配置来切换适配器:

mysql_config = {
adapter: "mysql",
host: "localhost",
username: "myuser",
password: "mypass",
database: "somedatabase"
}
sqlite_config = {
adapter: "sqlite",
database: "path/to/dbfile"
}

require "db/migrate/20130711000000_create_foos_table.rb"
ActiveRecord::Base.establish_connection(mysql_config)
CreateFoosTable.up # run against mysql
ActiveRecord::Base.establish_connection(sqlite_config)
CreateFoosTable.up # run against sqlite

现在回答您的第一个问题,我如何生成 sql 而不是实际执行它?

最简单的方法是覆盖 execute 方法来输出传入的任何内容:

# replace 'SQLiteAdapter' with AbstractMysqlAdapter to do the same for MySQL
ActiveRecord::ConnectionAdapters::SQLiteAdapter.class_eval do
def execute(sql, name=nil)
puts sql
end
end

运行 CreateFoosTable.up 现在应该将 SQL 输出到控制台。如果您想将 SQL 字符串捕获到某个变量,请将 puts sql 替换为适合您需要的任何逻辑。

请注意,虽然覆盖 execute 将适用于 create_table,但它无法正确完成修改现有表的工作。这是因为在生成修改 SQL 之前,需要 execute 来确定现有的模式。在这种情况下,您最好在继续之前设置别名并检查查询是否以 CREATEALTERDROP 开头。

关于ruby-on-rails - 有没有办法获取迁移的创建表语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17597788/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com