【问题标题】:Remove square brackets from array?从数组中删除方括号?
【发布时间】:2014-01-28 16:50:32
【问题描述】:

我有一个要加载到 SQL 语句中的数组。当我编译 SQL 语句并包含数组时,它还将[] 括号放入字符串中,我需要删除它们才能将其插入到我的数据库中。

这是我的代码:

i = 0

while i < rows.length
     sql = "INSERT INTO my_table VALUES(#{rows[i]})"
     puts sql
end

当前输出:

INSERT INTO my_table VALUES(["value 1", "value 2", "value 3"])

期望的输出:

INSERT INTO my_table VALUES("value 1", "value 2", "value 3")

【问题讨论】:

    标签: ruby tiny-tds


    【解决方案1】:

    使用inspectjoin

    sql = "INSERT INTO my_table VALUES(#{rows[i].map{|x| x.inspect}.join(', ')})"
    
    • map 对数组的每个元素调用一个块,然后将该元素设置为块的返回值
    • inspect 将字符串转换为其表示形式(如 "the string"(用引号括起来))
    • join 将它们放在一起,中间有一个分隔符

    【讨论】:

    • 哦,你是我的英雄先生!我一直在尝试使用 join(', '),但它给了我一个错误。谢谢!可以在 10 分钟内接受答复。
    • 不要使用inspect,这是完成一个非常简单的问题的一种非常容易出错的方法。 inspect 可以被覆盖以在调试时检查对象时提供自定义输出,这会影响您正在寻找的输出。
    • @theTinMan 那么你有什么建议呢?另外,我不知道你为什么要为字符串覆盖inspect...
    【解决方案2】:

    这是您所看到的:

    ary = ['value 1', 'value 2', 'value 3']
    "#{ ary }" # => "[\"value 1\", \"value 2\", \"value 3\"]"
    

    这是“检查”输出,由使用 Array.to_s AKA Array.inspect 引起。像我们通常看到的那样看待它:

    puts "#{ ary }"
    # >> ["value 1", "value 2", "value 3"]
    

    以下是解决方法:

    sql = "INSERT INTO my_table VALUES(#{ ary.map{ |i| '"%s"' % i }.join(', ') })" 
    # => "INSERT INTO my_table VALUES(\"value 1\", \"value 2\", \"value 3\")"
    
    puts sql
    # >> INSERT INTO my_table VALUES("value 1", "value 2", "value 3")
    

    '"%s"' % i 是一个 String format,它用双引号将字符串包裹起来。

    总而言之,如今与数据库通信的正确方法是使用体面的 ORM。 Ruby 有几个,我喜欢Sequel。 ORM 的主要胜利在于它消除了您的代码对数据库使用的语言的密切依赖性。通读它支持的list of databases,除了连接所需的 DSN 之外,无需更改代码中的任何内容。

    Sequel 目前有适用于 ADO、Amalgalite、CUBRID、DataObjects、DB2、DBI、Firebird、IBM_DB、Informix、JDBC、MySQL、Mysql2、ODBC、OpenBase、Oracle、PostgreSQL、SQLAnywhere、SQLite3、Swift 和 TinyTDS 的适配器。

    注意,TinyTDS 已列出。

    迁移工作、查询工作、插入、删除、更新,一切都是抽象的,当您迁移到更大/其他系统时,这是一个巨大的胜利。您可以从本地 SQLite 开始,使用 MySQL 或 PostgreSQL,然后切换到 Oracle,无需更改代码,只需调整 DSN。

    通读该网站的第一页以及the README,您会了解它的易用性,并想知道为什么要采用其他方式。

    【讨论】:

    • INSERT INTO my_table VALUES(value 1, value 2, value 3) 不是有效的 SQL...您缺少 "s。
    • @the Tin Man - 为续集添加信息 +1。我会调查的。
    猜你喜欢
    • 1970-01-01
    • 2018-01-13
    • 2019-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多