【问题标题】:Creating a Sqlite table with dynamically generated fields使用动态生成的字段创建 Sqlite 表
【发布时间】:2017-01-25 12:05:27
【问题描述】:

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

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

【问题讨论】:

    标签: ruby sqlite


    【解决方案1】:

    只需删除

    <<-SQL
    SQL
    

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

    这两个字符串都有hello的内容

    "hello"
    
    <<-SQL
    hello
    SQL
    

    【讨论】:

      猜你喜欢
      • 2017-02-25
      • 2018-06-12
      • 2015-03-10
      • 2021-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-24
      相关资源
      最近更新 更多