\ '(обратная косая черта, одинарная кавычка) в строке Ruby - PullRequest
5 голосов
/ 25 ноября 2011

Я использую Ruby 1.8.7, пытаюсь сгенерировать строку с символами \ ', чтобы создать скрипт для запуска в MySQL.Результат должен быть таким:

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', '')

И с:

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

Я получил эту строку:

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

Ответы [ 4 ]

6 голосов
/ 25 ноября 2011

Я рекомендую избегать написания необработанного SQL, и в этом возрасте я бы использовал ORM даже для простого использования БД.Я настоятельно рекомендую использовать камень Sequel .Заимствование из примера в документации по сиквелу:

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

Использование SQLite, которое запустило сиквел ORM в интерактивном режиме и создало базу данных SQLite с именем «temp».1009 *

Это включило ведение журнала, поэтому мы можем видеть, что будет делать 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')
 => [] 

Doh!Я забыл создать таблицу ...

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 базы данных тривиально.

3 голосов
/ 25 ноября 2011

Дело в том, что он показывает, что на самом деле находится в строке. Голая консоль показывает сбежавшую строку. Попробуйте это на консоли:

"Joana d\\'Arc".size

Ты вернешься 12. Если бы там были оба обратные слеши, ты должен получить 13.

Ответ Хаулета должен сработать.

1 голос
/ 25 ноября 2011

Напишите, используя %q{} запись

string = %q[INSERT INTO table (name, description) values ('Joanna d\\'Arc', '')]
0 голосов
/ 25 ноября 2011

Вы можете попробовать это:

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

Я не знаю, нужно ли использовать 1.8.6, но если вы можете, обновите до 1.9.2. Это намного быстрее и стабильнее, наряду со многими другими функциями.

...