ruby - 使用动态生成的字段创建Sqlite表

标签 ruby sqlite

我在ruby中使用sqlite3 gem,这是github给出的gems示例:

require "sqlite3"

# Open a database
db = SQLite3::Database.new "test.db"

# Create a table
rows = db.execute <<-SQL
  create table numbers (
    name varchar(30),
    val int
  );
SQL


这是我的实现,在这里我尝试用动态生成的字符串替换db.execute的参数

require "sqlite3"

db_params = {
    db_name: "house-reps", 
    tables: 
        [
            {
                table_name: "house-reps-party",
                table_fields: [
                    "region varchar(30)",
                    "congress int",
                    "year int",
                    "party varchar(30)",
                    "percent int",
                    "seats int"
                ]
            }
        ]
}
def init_db(db_params)
    tables = db_params[:tables]

    db = SQLite3::Database.new "#{db_params[:db_name]}"
    tables.each do |table|
        db.execute("<<-SQL\n  create table #{table[:table_name]} (\n   #{table[:table_fields].join(",\n    ")}\n   );\nSQL")
    end
end

init_db(db_params)


这是字符串插值的输出:

<<-SQL
  create table party-total (
   region varchar(30),
    congress int,
    year int,
    party varchar(30),
    percent int,
    seats int
   );
SQL


但是,当我运行程序时,它会给我以下信息:

/usr/local/lib/ruby/gems/2.4.0/gems/sqlite3-1.3.13/lib/sqlite3/database.rb:91:in `initialize': near "<<": syntax error (SQLite3::SQLException)
    from /usr/local/lib/ruby/gems/2.4.0/gems/sqlite3-1.3.13/lib/sqlite3/database.rb:91:in `new'
    from /usr/local/lib/ruby/gems/2.4.0/gems/sqlite3-1.3.13/lib/sqlite3/database.rb:91:in `prepare'
    from /usr/local/lib/ruby/gems/2.4.0/gems/sqlite3-1.3.13/lib/sqlite3/database.rb:137:in `execute'
    from database.rb:25:in `block in init_db'
    from database.rb:23:in `each'
    from database.rb:23:in `init_db'
    from database.rb:29:in `<main>'


我猜这与db.execute的调用方式有关。我已经尝试过这些方法:

db.execute("<<-SQL\n  create table #{table[:table_name]} (\n   #{table[:table_fields].join(",\n    ")}\n   );\nSQL")

db.execute "<<-SQL\n  create table #{table[:table_name]} (\n   #{table[:table_fields].join(",\n    ")}\n   );\nSQL"

db.execute <<-SQL "\n  create table #{table[:table_name]} (\n   #{table[:table_fields].join(",\n    ")}\n   );\n" SQL

最佳答案

只需删除

<<-SQL
SQL


这些不是字符串的一部分,而是多行字符串的“引号”。

这两个字符串的内容均为hello

"hello"

<<-SQL
hello
SQL

关于ruby - 使用动态生成的字段创建Sqlite表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41842793/

相关文章:

ruby-on-rails - Rails 4.0 未定义方法 `call'

ruby-on-rails - 如何从 rails_admin 中删除图像?

r - 尝试在 Linux 上的 R 中安装 rgdal 包时出现问题

android - 如何在android上根据时间戳删除sqlite数据库中的条目

ruby - 设置未初始化的实例变量

ruby-on-rails - 传递对象或对象 ID?

ruby - 是否可以从代码中使用 'bundle exec' 功能?

c++ - SQLite 不完整类型错误

python - 使用 WHERE ___ IN ___ 语句

Android:创建 ListView ,日期作为页眉,总数作为页脚