5

MySQLで実行するためのスクリプトを作成するために、Ruby1.8.7を使用して\'文字を含む文字列を生成しようとしています。結果は次のようになります。

INSERT INTO table (name, description) values ('Joana d\'Arc', '')

しかし、ルビー文字列でバックスラッシュを1つだけ取得することはできません。次のコードを使用します。

string = "INSERT INTO table (name, description) values ('Joana d\\'Arc', '')"

次の文字列を取得しました。

INSERT INTO table (name, description) values ('Joana d\\'Arc', '')

そしてと:

string = "INSERT INTO table (name, description) values ('Joana d\'Arc', '')"

私はこの文字列を取得しました:

INSERT INTO table (name, description) values ('Joana d'Arc', '')
4

4 に答える 4

6

生のSQLを書くことは避けることをお勧めします。この時代では、単純なDBの使用であっても、ORMを使用します。続編の宝石を使用することを強くお勧めします。続編のドキュメントのから借用:

sequel sqlite://temp
Your database is stored in DB...

SQLiteを使用して、インタラクティブモードで続編ORMを開始し、「temp」と呼ばれるSQLiteデータベースを作成しました。

ruby-1.9.2-p290 :001 > require 'logger'
 => true 
ruby-1.9.2-p290 :002 > DB.loggers << Logger.new(STDOUT)
 => [#<Logger:0x0000010160bc40 @progname=nil, @level=0, @default_formatter=#<Logger::Formatter:0x0000010160bc18 @datetime_format=nil>, @formatter=nil, @logdev=#<Logger::LogDevice:0x0000010160bbc8 @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#<IO:<STDOUT>>, @mutex=#<Logger::LogDevice::LogDeviceMutex:0x0000010160bba0 @mon_owner=nil, @mon_count=0, @mon_mutex=#<Mutex:0x0000010160bb50>>>>] 

これによりロギングが有効になり、Sequelがデータベースと通信するときに何が行われるかを確認できます。

ruby-1.9.2-p290 :003 > items = DB[:items] # Create a dataset
 => #<Sequel::SQLite::Dataset: "SELECT * FROM `items`"> 
ruby-1.9.2-p290 :004 > DB.tables
I, [2011-11-25T10:17:13.056311 #10130]  INFO -- : (0.000501s) SELECT * FROM `sqlite_master` WHERE (type = 'table' AND NOT name = 'sqlite_sequence')
 => [] 

ドー!テーブルを作成するのを忘れました...

ruby-1.9.2-p290 :005 > DB.create_table :items do
ruby-1.9.2-p290 :006 >       primary_key :id
ruby-1.9.2-p290 :007?>     String :name
ruby-1.9.2-p290 :008?>     Float :price
ruby-1.9.2-p290 :009?>   end
I, [2011-11-25T10:17:20.985851 #10130]  INFO -- : (0.002372s) CREATE TABLE `items` (`id` integer PRIMARY KEY AUTOINCREMENT, `name` varchar(255), `price` double precision)
 => nil 

テーブルが作成されます。

ruby-1.9.2-p290 :010 > items = DB[:items] # Create a dataset
 => #<Sequel::SQLite::Dataset: "SELECT * FROM `items`"> 

これによりデータセットが作成されました。これは、テーブルと通信するための便利な方法です。

そして、それは見返りです:

ruby-1.9.2-p290 :011 > items.insert(:name => "Joan d'Arc")
I, [2011-11-25T10:17:45.186945 #10130]  INFO -- : (0.001981s) INSERT INTO `items` (`name`) VALUES ('Joan d''Arc')
 => 1

ORMは自動的に文字をエスケープします。あなたの仕事は大幅に簡素化されます。

ORMはDBMを認識しているため、特定のデータベースにいつエスケープするかを知っています。コードは変更されません。SQLiteからMySQL、Postgres、さらには非SQLデータベースに切り替えるのは簡単です。

于 2011-11-25T17:24:32.987 に答える
3

putsが機能する理由は、文字列に実際に何が含まれているかを示すためです。裸のコンソールは、文字列がエスケープされていることを示しています。コンソールでこれを試してください:

"Joana d\\'Arc".size

あなたは12を取り戻すでしょう。両方の円記号がそこにあったならば、あなたは13を得るはずです。

Haulethの答えはうまくいくはずです。

于 2011-11-25T17:36:45.870 に答える
1

%q{}表記を使って書く

string = %q[INSERT INTO table (name, description) values ('Joanna d\\'Arc', '')]
于 2011-11-25T17:20:10.163 に答える
0

あなたはこれを試すことができます:

string="INSERT INTO table (name, description) values ('Joana d"+"\\"+"'Arc','')"

1.8.6を使用する必要があるかどうかはわかりませんが、使用できる場合は1.9.2に更新してください。そのはるかに高速で安定しており、さらに多くの機能があります。

于 2011-11-25T17:12:12.963 に答える