[Ruby] połączenie z bazą

Witajcie, muszę przekonwertować sporą ilość danych z jednej bazy do drugiej. Póki co próbowałem to zrobić w najprostszy sposób jaki przyszedł mi do głowy:

[code]require ‘rubygems’
require ‘mysql’

con = Mysql.new(‘localhost’, ‘user’, ‘pass’, ‘db’) #baza z ktorej kopiuje
sec = Mysql.new(‘localhost’, ‘user’, ‘pass’, ‘db’) #baza docelowa
q = con.query('set names utf8)
q = sec.query('set names utf8)
rs = con.query(‘SELECT * FROM users LIMIT 10’)

rs.each_hash { |h|
sec.query(“INSERT INTO users VALUES (’’, ‘#{h[‘login’]}’, ‘#{h[‘email’]}’, ‘#{pass}’, ‘#{html}’)”)
}

con.close
sec.close[/code]
Napotkałem dwa problemy. Mimo użycia “set names utf8” po wgraniu do bazy zamiast polskich znaczków mam znaki zapytania. Dodam, że baza danych źródłowa jest zapisana w utf8 i w phpmyadmin normalnie widzę tam polskie znaki. Sądze, że to komplikuje znacząco sprawę bo tak na prawdę to nie wiadomo czemu wrzuca znaki zapytania :stuck_out_tongue: W sytuacji gdy “ręcznie” robie eksport bazy z jednej i wklejam do okienka zapytań w drugiej znaki polskie są.

Drugi problem to konstrukcja INSERT INTO. W takiej postaci spędza mi sen z powiek. W polu html jest spory bajzel wygnerowany przez narzędzie WYSIWYG i przy obecnej postaci często pole jest ucinane. Może lepiej skorzystać z konstrukcji INSERT gdzie umieszczone będą ?, a potem wyszczególnione zmienne do podstawienia. W phpie coś takiego kiedyś robiłem, ale niestety nie wiem jak to zrobić w Rubym. Szukałem w necie konstrukcji metody query, ale nic nie znalazłem na temat wcześniej wspomnianego podstawienia.

Byłby ktoś tak dobry i naprowadził nieco w tych dwóćh sprawach?
Pozdrawiam

Robiłem coś podobnego jako skrypt rake, ale dla bazy docelowej w aplikacji railsowej, możesz wtedy normalnie używać modeli, trzeba tylko dodać na początku require ‘config/environment’.

Jesteś pewien, że kodowanie w bazie i w tabeli do której robisz INSER masz ustawione na utf8?
Wyświetl sobie na konsole wynik pobrania rekordów (niektóre kolumny z tekstem zawierającym polskie znaki) z bazy źródłowej, przed wstawieniem, i zobacz co Ci wyświetla. Może na etapie pobierania danych już są znaki zapytania.

Co do drugiego tematu to korzystanie ze znaków zapytania jest lepszym rozwiązaniem i wg mnie nie ma nic wspólnego z obcinaniem tekstu. Sprawdź typ kolumny docelowej i czy w źródle już nie masz obcięte.
Przykład jak wykorzystać bindowanie zmiennych do SQL, akurat dla Twojego przypadku, masz w tu - http://www.tmtm.org/en/mysql/ruby/

Dzięki za wypowiedzi. Okazało się, że kodowanie nie działało z mojej własnej winy. W pliku rb zapytanie set names utf8 wykonywałem pod linijką z selectem :smiley: Owszem przekopiowałem potem tę linijkę, ale w konsoli odpalałem nie ten plik co trzeba. Co do query z podstawianiem ? to pomogło z ucinaniem zawartości. Trudno powiedzieć czemu tak było, może jakieś znaczki w bazie powodowały ignorowanie dalszego ciagu danej zmiennej .