dbh.do 使用? 問題


#1

您好: 我參考某範例,如下:
其中 他用? 來做 預留位置
但實際操做,卻
07_05.rb:5: syntax error, unexpected ‘,’, expecting ‘)’
,‘Ruby’,‘666’ )

請問,這是否要改用 prepare 來做?

謝謝

require 'dbi’
begin
dbh=DBI.connect(“dbi:Mysql:book:localhost”,“root”,“root”)
rows= dbh.do(“INSERT INTO book(name,ISBN) values(‘JSP’,‘555’),(?,?)”
,‘Ruby’,‘666’ )
puts "INSeRT OK #{rows}"
rescue
puts “#{e.err}”

ensure
dbh.disconnect if dbh
end


#2

首先,新手第一課,把 code 排好,去學 markdown … 再來,你的東西是 syntax error:語法錯誤,簡單的來說你的 code 寫錯了,和其他東西都無關的,很類似你亂打一票字,你也會得到相同的錯誤就是

require 'dbi'
begin
  dbh = DBI.connect("dbi:Mysql:book:localhost","root","root")
  rows = dbh.do(
    #如果有下一行,請把下面這行最後接','號,而不是放在下一行上
    "INSERT INTO book(name,ISBN) values('JSP','555'),(?,?)",
    'Ruby','666'
  )
  puts "INSeRT OK #{rows}"
rescue
  puts "#{e.err}"
  #這邊哪來的 e ... 上面應該是 rescue Exception => e 這邊才有 e 好用
ensure
  dbh.disconnect if dbh
end

實際 code 未測,因為我不用你所謂的 dbh.do,且 Ruby 也沒人用它來連線 DB…而你用的 lib 已經八年沒更新了…是 Ruby 1.8.7 時代的啊…

你可以參考這篇,在純 Ruby 的環境下用 ActiveRecord,其中的 adapter 換掉你就可以連其他的 db 類似 oracle 之類的,且 ActiveRecord 也有可以打純 SQL 的方式來下指令哩,以上


#3

您好:
謝謝,想再請教 若用 Mysql類別內的 escape_string(),範例如下
存到DB 時, love’tang =>love’tang
這樣是OK的嗎?

   require "mysql"
begin 
     con=Mysql.new('localhost','root','root','book')
     bookname=con.escape_string("love'tang"); 
     bookisbn=con.escape_string("122,456,789") 

     pst=con.prepare("insert  into books(name,isbn) values(?,?) ")
     pst.execute(bookname,bookisbn);
rescue
       Mysql::Error =>e
        puts e
ensure
      con.close() if con
      pst.close() if pst
end

#4

我說 … 你走的路完全不對啊啊啊 ((抱頭

Ruby 下沒人直接用 mysql gem,你安裝的那個 mysql gem 也是 Ruby 1.8.7 時代的,你要的東西可用 ActiveRecord 來轉介,再來你的 escape_string 在 Ruby 下叫別的東西( 你想找的 quote 系列是很糟糕的作法哩 ),也都在 ActiveRecord 內

我再寫一次給你看好了,雖然我已經貼給你看過了,而你沒去嘗試的

不管哪種 linux,請先安裝 libmysqlclient-dev

sudo apt-get install libmysqlclient-dev

之後安裝 mysql2 和 activerecord

gem i mysql2 activerecord

然後直接 demo code

require 'active_record'
require 'mysql2'

ActiveRecord::Base.establish_connection({
  adapter:  'mysql2',
  encoding: 'utf8'  ,
  database: 'tester', #記得要先去建立資料庫
  username: 'imroot', #改你的帳號
  password: 'imroot'  #改你的密碼
})

temp = ActiveRecord::Base.connection.execute("SELECT 1").to_a
#=> [[1]]

temp = ActiveRecord::Base.connection.execute(
  ActiveRecord::Base.send(:sanitize_sql,["SELECT ?" , 1])
).to_a
#=> [[1]]

這邊是等同於你想做的安全的最簡式,但 … 還是沒人這樣弄的啦,因為寫 Ruby 的人都很偷懶,這樣也太累不好用 … 所以你真的不考慮一下從頭看一下我們在 Youtube 上面的教學和學一下 Rails 的 ActiveRecord 的基本用法嗎?

Ruby 下都用 connection pool 那邊 ActiveRecord 會幫你管好好,所以不用管 connection 的 start and close,新手改用 ORM 學會包裝後就可以摸得很好(單純要學 OOP 和 ORM 的基本操作),必要時才學上面直接下 SQL,好東西不用嗎?


#5

版主:不好意思
又讓您頭痛了
我有先看過您2個影片

想說,先把 之前看的書籍 告一個段落,所以先把他的範例,拿來 UBuntu 測試
造成困擾,敬請見諒!


#6

另外,想順便請教

第2集影片中,
book.rb 中

class Book < ActiveRecord::Base

has_many :book_owner
has_many :book , :through => :book_woner  

belongs_to :owner , :polymorphic =>true  
end

需要對自己做 多對多 對應嗎?
has_many :book , :through => :book_woner


#7

所謂的多對多,其實都是多個一對多,這樣的結構

1 : N : M

就是所謂的多對多,而左邊要到又邊要穿過中間的那個,所以 “through” 就是這個意思

Rails 的 relation 只是加 method 而已,而你可以自幹做到完全一樣的事情,然而我後來的作品如果有多對多時,大部分都用自己寫的方式,而非用內建的 … 因為效果很差且有時不如預期

anyway 可以的話先把別的東西練好,而…你就會知道如何寫『多個一對多』來解決相同的問題才是


#8

您好:
謝謝您,
請問別的東西 是指?
還是您的影片 後續還會在講解?
謝謝!


#9

沒,而是你沒學好基本的東西,就想去打王唄

把你基本水平先提升起來,先不要去想你該做些什麼
之後你應該可以用你的基本的東西,做到原先當下困難的想法才是

先知道世界觀,瀏覽一次,把小王全打過,才去挑戰下個等級該挑戰的唄

影片中的 Ruby / Rails 最後一堂課在破題就是了,Ruby最厲害的應該是無相神功
當你吸收完一切後,再放下一切後,自然就會有出入的

類似 Rails 規定了一票 relation 的作法,給你世界觀,但如果不讓你用 Rails 的做法來做,你是否能寫出相同的東西呢?其實 relation 的道理很簡單,而你沒用心推敲罷了,只遵循著別人包裝給你的方向走,你無法走出自己的路哩,然後又問我該如何走下去?

PS:你在這個論壇搜尋 relation 後,你應該會看到我根本到處亂走唄哈哈