我有一个数字和文本连接的变量(例如“[79511]火箭”)。如果此变量确实包含括号内的数字,那么我必须在我的表的一列中存储(仅限数字)。我用以下代码验证了这一点:
Animal
当我使用Puts进行测试时,它的工作原理为79511,很好。 但是当我运行代码插入数据库时,如下所示:
enterprise_id = "[79511]Rocket".split(/[\[\]]/x)[1].match(/^(\d)+$/) rescue nil
目标列是表格中的整数类型。
它会抛出错误:
enterprise_id = "[79511]Rocket".split(/[\[\]]/x)[1].match(/^(\d)+$/) rescue nil
insert_ds = DB["INSERT INTO pd_deals ( enterprise_id ) VALUES (?)", enterprise_id]
insert_ds.insert
我这样做是因为我需要从字符串中提取一个数字。有暗示吗?有没有更好的方法?
答案 0 :(得分:2)
如果您执行:
"[79511]Rocket".split(/[\[\]]/x)[1].match(/^(\d)+$/)
在irb
中,您会看到:
=> #<MatchData "79511" 1:"1">
因为String#match
返回MatchData
个实例,而inspect
上的MatchData
调用#<MatchData ...>
会给您puts
。如果您puts "[79511]Rocket".split(/[\[\]]/x)[1].match(/^(\d)+$/)
该值:
79511
您会看到puts
,因为to_s
会在其参数上调用to_s
将其转换为字符串。
续集不会调用MatchData
,它会尝试弄清楚如何将参数转换为数据库自己理解的内容,并且它不知道如何处理can't express #<MatchData "79511" 1:"1"> as a SQL literal
实例,因此:
to_s
错误。
您可以自己致电DB["INSERT INTO pd_deals ( enterprise_id ) VALUES (?)", enterprise_id.to_s.presence]
:
MatchData#[]
或使用DB["...", enterprise_id ? enterise_id[0] : nil]
方法:
String#[]
甚至使用enterprise_id = "[79511]Rocket"[/(?<=\[)\d+(?=\])/]
DB["...", enterprise_id.presence]
,正如Cary Swoveland所暗示的那样:
to_i
我对Sequel并不熟悉,因此您可能需要进行一些'79511'
来电,将79511
字符串转换为M*S*sizeof(float)/8e-3/1e9=14GB/s
个数字。