æè¿ Sequel ã¨ããã©ã¤ãã©ãªã触ã£ã¦ãã®ã§ç°¡åã«ã¾ã¨ãã¦ã¿ã¾ãã
Sequel
Sequel 㯠Ruby ã®æ§æã§ SQL ã¯ã¨ãªãè¨è¿°ããããã®ã©ã¤ãã©ãªã§ãã SQL ã®ææ³ãå«ããªèªåã«ã¯æã£ã¦æ¥ãã§ãã RDB æ¯ã®å·®ç°ãå¸åãã¦ããã¾ãã èªå㯠MySQL ããç¥ããªãã®ã§ã以ä¸ã¯ MySQL ã§ã®ä¾ã§ãã
ã¤ã³ã¹ãã¼ã«
% gem install sequel % gem install ruby-mysql
æ¥ç¶
DB = Sequel.connect('mysql://user:password@hostname:port/dbname') # ã¾ã㯠DB = Sequel.mysql('dbname', :host=>'hostname', :user=>'user', :password=>'password', :port=>'port')
ä¸ã®ä¾ã§ã¯å®æ° DB ã«ä»£å ¥ãã¦ãã¾ããããã¼ã«ã«å¤æ°ãã¤ã³ã¹ã¿ã³ã¹å¤æ°ã§ãåé¡ããã¾ããã
åºæ¬
åºæ¬çã«å¯¾è±¡ãã¼ãã«ã«å¯¾ãã¦ã¬ã³ã¼ãã®ç¯å²ãéå®ããæ¡ä»¶ãæå®ããããã¦ããã®ã¬ã³ã¼ãã«å¯¾ãã¦ã®æä½ãæå®ãã¾ãã ãã¼ãã«åãã«ã©ã åã¯ã·ã³ãã«ã§æå®ãã¾ãã
# SELECT DB[:tbl].where(:col1=>value1).select(:col2, :col3).all #=> ã¬ã³ã¼ã(Hash)ã®é å [{:col2=>val, :col3=>val}, ... ] # UPDATE DB[:tbl].where(:col1=>value1).update(:col2=>value2, :col3=>value3) #=> æ´æ°ããã¬ã³ã¼ãæ° # DELETE DB[:tbl].where(:col1=>value1).delete #=> åé¤ããã¬ã³ã¼ãæ° # INSERT DB[:tbl].insert(:col1=>value1, :col2=>value2, :col3=>value3) #=> æ¿å ¥ããã¬ã³ã¼ãã« AUTO_INCREMENT ãããã°ãã®å¤ãç¡ããã° 0
update, delete, insert ã¯ã¡ã½ããå®è¡æã«ã¯ã¨ãªãå®è¡ããã¾ãã select ã¡ã½ããã¯åãåºãã«ã©ã ãæå®ããã ãã§ãå®éã§ã¯ã¨ãªãå®è¡ãããã®ã¯ãall çã®ã¡ã½ããå®è¡æã§ãã
where ã¡ã½ããã®ä»£ããã« filter ã使ç¨ã§ãã¾ãã
SQL ç´æ¥æå®
å¤ãè¿ããªãã¯ã¨ãª
DB.run("SET some_variable = 123") DB.run("INSERT INTO tbl VALUES (...)")
å¤ãè¿ãã¯ã¨ãª
DB["SELECT * FROM tbl"].all #=> ã¬ã³ã¼ã(Hash)ã®é å DB.fetch("SELECT * FROM tbl"){|rec| ...} #=> ã¬ã³ã¼ãæ¯ã«ãããã¯ãå®è¡ãã
æå®ã§ããæ¡ä»¶
where ã«å¼æ°ãæå®ããæ¹æ³ã¨ãããã¯ã§æå®ããæ¹æ³ãããã¾ãã ãããã¯ã¯ç¹æ®ãªã³ã³ããã¹ãã§å®è¡ããã¾ãã LIKE ãä¸çå·çã¯ãããã¯ã§æå®ããæ¹ãç°¡åã«è¨è¿°ã§ãã¾ãã
ä¸è´
where(:col => 123) #=> col = 123
ç¯å²
where(:col => 1..99) #=> col >=1 AND col <= 99
IN
where(:col => [1,2,3]) #=> col IN (1,2,3)
LIKE
where(Sequel.like(:col, '%abc%')) #=> col LIKE BINARY '%abc%' # 大æåå°æåãåºå¥ãã where(Sequel.ilike(:col, '%abc%')) #=> col LIKE '%abc%' # 大æåå°æåãåºå¥ããªã where{col.like '%abc%'} #=> col LIKE BINARY '%abc%' where{col.ilike '%abc%'} #=> col LIKE '%abc%'
LIKE ã®ã¯ã¤ã«ãã«ã¼ã(% ã _)ãå«ãæååãã¨ã¹ã±ã¼ãããããã« Sequel::Dataset#escape_like ã使ç¨ã§ãã¾ãã
pattern = DB[:tbl].escape_like('a%b_c') #=> 'a\%b\_c' DB[:tbl].where(Sequel.ilike(:col, "%#{pattern}%")) #=> SELECT * FROM tbl WHERE col LIKE '%a\\%b\\_c%'
REGEXP
where(:col => /abc/) #=> col REGEXP BINARY 'abc' # 大æåå°æåãåºå¥ãã where(:col => /abc/i) #=> col REGEXP 'abc' # 大æåå°æåãåºå¥ããªã where(Sequel.like(:col, /abc/)) #=> col REGEXP BINARY '%abc%' where(Sequel.like(:col, /abc/i)) #=> col REGEXP '%abc%' where(Sequel.ilike(:col, /abc/)) #=> col REGEXP '%abc%' where{col.like /abc/} #=> col REGEXP BINARY '%abc%' where{col.like /abc/i} #=> col REGEXP '%abc%' where{col.ilike /abc/} #=> col REGEXP '%abc%'
>, < >=, <=
where(Sequel.expr(:col) > 123) #=> col > 123 where(Sequel.expr(:col) < 123) #=> col < 123 where(Sequel.expr(:col) >= 123) #=> col >= 123 where(Sequel.expr(:col) <= 123) #=> col <= 123 where{col > 123} #=> col > 123 where{col < 123} #=> col < 123 where{col >= 123} #=> col >= 123 where{col <= 123} #=> col <= 123
AND
Hash ã«è¤æ°è¦ç´ ãæå®ãã㨠AND ã§çµåããã¾ãã
where(:col1 => 123, :col2 => 456) #=> col1 = 123 AND col2 = 456
where ã«è¤æ°å¼æ°ãä¸ãã㨠AND ã§çµåããã¾ãã
where({:col1 => 123}, Sequel.ilike(:col2, '%abc%')) #=> col1 = 123 AND col2 LIKE '%abc%'
where ã«å¼æ°ã¨ãããã¯ã®ä¸¡æ¹ãä¸ãã㨠AND ã§çµåããã¾ãã
where(:col1 => 123){col2.ilike '%abc%'} #=> col1 = 123 AND col2 LIKE '%abc%'
è¤æ°ã® where ãé£çµãã㨠AND ã§çµåããã¾ãã
where(:col1 => 123).where(:col2 => 456) #=> col1 = 123 AND col2 = 456
Sequel.& ã使ã£ã¦æç¤ºçã« AND çµåãããã¨ãã§ãã¾ãã
where(Sequel.&({:col1 => 123}, {:col2 => 456})) #=> col1 = 123 AND col2 = 456
Sequel ã§è¡¨ç¾ããæ¡ä»¶ã where ãããã¯å ã§ã¯ & ã使ç¨ã§ãã¾ãã
where((Sequel.expr(:col1) > 123) & (Sequel.expr(:col2) < 456)) #=> col1 > 123 AND col2 < 456 where{(col1 > 123) & (col2 < 456)} #=> col1 > 123 AND col2 < 456
OR
è¤æ°è¦ç´ ã® Hash ã AND ã§ã¯ãªã OR ã§çµåããã«ã¯ Sequel.or ã使ç¨ãã¾ãã
where(Sequel.or(:col1 => 123, :col2 => 456)) #=> col1 = 123 OR col2 = 456
è¤æ°æ¡ä»¶ã OR ã§çµåããã«ã¯ Sequel.| ã使ç¨ãã¾ãã
where(Sequel.|({:col1 => 123}, Sequel.expr(:col2) > 456)) #=> col1 = 123 OR col2 > 456 where((Sequel.expr(:col1) > 123) | (Sequel.expr(:col2) < 456)) #=> col1 > 123 OR col2 < 456 where{(col > 123) | (col2 < 456)} #=> col1 > 123 OR col2 < 456
NOT
where ã®ä»£ããã« exclude ã使ç¨ããã°æ¡ä»¶ãå転ãã¾ãã
exclude(:col1 => 123) # col1 != 123 exclude({:col1 => 123}, Sequel.expr(:col2) > 456) # col1 != 123 OR col2 <= 456 where(col1 => 123).exclude(col2 => 456) # col1 = 123 AND col2 != 456
ç¹å®ã®æ¡ä»¶ã ããå転ãããããã« Sequel.~ ã使ç¨ã§ãã¾ãã
where(Sequel.~(:col1 => 123)) #=> col1 != 123 where(Sequel.~(:col1 => 123, :col2 => 456)) #=> col1 != 123 OR col2 != 456 where(Sequel.~(Sequel.ilike(:col1, '%abc%'))) #=> col1 NOT LIKE '%abc%' where{~(col1.ilike "%abc%")} #=> col1 NOT LIKE '%abc%'
ãããã¯ã使ç¨ããéã®æ³¨æ
ãããã¯å ã§æªå®ç¾©å¤æ°ãåç §ããã¨ã«ã©ã åã SQL 颿°ã¨ãã¦æ±ããã¾ããããããã¯ã®å¤ã§å®ç¾©æ¸ã¿ã®ãã¼ã«ã«å¤æ°ã¯ãã®ã¾ã¾å¤æ°ã¨ãã¦ä½¿ç¨ããã¦ãã¾ãã¾ãã ã«ã©ã åã¨ãã¦æ±ãããå ´åã¯ã()ããã¤ãã¦æªå®ç¾©ã¡ã½ããã¨ãã¦è¡¨ç¾ããå¿ è¦ãããã¾ãã
DB[:tbl].where{abc > 123} #=> SELECT * FROM tbl WHERE abc > 123 abc = 456 DB[:tbl].where{abc > 123} #=> SELECT * FROM tbl WHERE 1 (456 > 123 㯠true ã«ãªããã) DB[:tbl].where{abc() > 123} #=> SELECT * FROM tbl WHERE abc > 123