gpt4 book ai didi

mysql - 在 Rails 中动态创建 mysql 列

转载 作者:行者123 更新时间:2023-11-29 10:41:10 25 4
gpt4 key购买 nike

我正在开发一种私有(private) API,它将我们的许多数据库/供应商数据统一到一个 SQL 数据库中。

我们的 ESP 面临着挑战,我们的营销人员总是在更改/添加新栏目。我们希望这个应用程序能够随着这些列的更改而扩展,并且不需要每次更改名称或添加新属性时都对列进行调整。

我需要使用 Rails 即时创建列列表(我们不想在 Mysql 中 100% 执行此操作,因为我们要重命名映射中的某些列)。

table = "customer"
attrs = ["vendor_cm_name_d", "vendor_cm_email address_d", "vendor_cm_date added_d", "vendor_cm_extid_d" ]

attrs.each_with_index do |attr, i|
connection = ActiveRecord::Base.connection
connection.execute( "ALTER TABLE #{table} ADD COLUMN #{attr} VARCHAR(15);" )
# this didnt work :-( connection.close
end

此方法适用于单列,但对于数组中的多个元素会失败。阅读日志(粘贴在下面)似乎是在尝试将整个语句作为一次调用运行,而不是以事务方式运行。我尝试在每个循环结束之前添加一个connection.close,但这也不起作用。欢迎大家指点。

Mysql2::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'address_d VARCHAR(15)' at line 1: ALTER TABLE customer  ADD COLUMN vendor_cm_email address_d VARCHAR(15);
ActiveRecord::StatementInvalid: Mysql2::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'address_d VARCHAR(15)' at line 1: ALTER TABLE customer ADD COLUMN vendor_cm_email address_d VARCHAR(15);

最佳答案

您的 sql 不起作用,因为列名有空格。用引号将生成的 sql 中的列名称括起来。

attrs.each_with_index do |x, i|
connection = ActiveRecord::Base.connection
connection.execute "ALTER TABLE #{table} ADD COLUMN \"#{x}\" VARCHAR(15);"
# this didnt work :-( connection.close
end

虽然我宁愿不走自己写sql的路。相反,您可以创建这样的服务:

class DbService < ActiveRecord::Migration
def initialize(table_name)
@table_name = table_name
end
def add_string_column(column_name)
add_column @table_name, column_name, :string
end
end

然后做类似的事情

service = DbService.new("customer")
attrs.each do |column_name|
service.add_string_column(column_name)
end

关于mysql - 在 Rails 中动态创建 mysql 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45448484/

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