1

「CanonPowerShot12.1-Megapixel」という文字列の例がありますが、次のコードを実行すると失敗するようです。

db.execute "CREATE TABLE IF NOT EXISTS Products( id INTEGER PRIMARY KEY, stockID INTEGER, Name TEXT )" 

id = 12345
name = "Canon PowerShot 12.1-Megapixel"       

db.execute( "INSERT INTO Products ( stockID, Name ) VALUES ( #{id}, #{name} )" )

エラーコードは次のとおりです。

C:/Ruby/Ruby193/lib/ruby/gems/1.9.1/gems/sqlite3-1.3.6-x86-mingw32/lib/sqlite3/d
atabase.rb:91:in `initialize': near "PowerShot": syntax error
(SQLite3::SQLExcep tion)
        from C:/Ruby/Ruby193/lib/ruby/gems/1.9.1/gems/sqlite3-1.3.6-x86-mingw32/
lib/sqlite3/database.rb:91:in `new'
        from C:/Ruby/Ruby193/lib/ruby/gems/1.9.1/gems/sqlite3-1.3.6-x86-mingw32/
lib/sqlite3/database.rb:91:in `prepare'
        from C:/Ruby/Ruby193/lib/ruby/gems/1.9.1/gems/sqlite3-1.3.6-x86-mingw32/
lib/sqlite3/database.rb:134:in `execute'
        from E:/Documents/Cowboom/scraping/DBDOTDList.rb:48:in `<main>'

なぜこれが「PowerShot」の後に死ぬのか、何か考えはありますか?

4

1 に答える 1

13

作成している文字列を引用符で囲みません。したがって、文字列は実際には次のようになります。

"INSERT INTO Products ( stockID, Name ) VALUES ( 12345, Canon PowerShot 12.1-Megapixel )"

ご覧のとおり、これは無効な SQL です。Canon PowerSho 12.1-Megapixel文字列としてではなく、SQL ステートメントの一部として解釈しようとします。

変数の補間を引用符で囲むことで、これを修正できます。

db.execute( "INSERT INTO Products ( stockID, Name ) VALUES ( #{id}, '#{name}' )" )

ただし、これは一般的に悪い考えです。文字列が. '_ _ 通常、文字列を補間または追加して SQL クエリを作成しようとすることは避けてください。間違った文字を除外したり引用したりできると思うかもしれませんが、実際にはそれは非常に困難です。

代わりに、SQL ステートメントに渡す変数データには、バインドされたパラメーターを使用する必要があります。

db.execute( "INSERT INTO Products ( stockID, Name ) VALUES ( ?, ? )", [id, name])

詳細と例については、sqlite3-ruby のドキュメントを参照してください。

于 2012-11-19T21:05:24.840 に答える