Forum Webscript.Ru
Общие => Базы данных => Тема начата: Creator от 09 Апреля 2002, 10:54:46
-
Есть проблема, есть теория, но нет реального решения. Изложу в кратце...
Существует сиквеловская база (порядка 15тыс. записей). В базе где то около 20 таблиц, в среднем по 15 полей в каждой.
Цель: Нужно произвести выборку вхождений и произвести их замену. Например: есть запись "aaa.333.xxx*123" в которой нужно заменить вхождение "xxx*123" на "444-45-56", в результате чего должна получится запись типа "ааа.333.444-45-56".
Вот и пришли к вопросу: как это сделать?
база на уделенном сервере (Линукс), шелла нет, фтп доступ есть. cgi-bin соответственно тоже есть.
-
Есть такая функция для строк, как REPLACE()
http://www.mysql.com/doc/S/t/String_functions.html
только одним MySQLем все равно не отделаешься ...
тебе вначале придется сделать выборку значений, которые ты апдейтить будешь, а потом уже делать апдейт в таблице...
-
как это сделать?
Вариант раз: ручками. У меня, например, есть скрипт (перл) очень простой, реализующий интерфейс командной строки к MySql. Можно взять phpMyAdmin. И update по каждой из таблиц для нужных полей.
Вариант два: на любом языке реализуешь след. алгоритм.
show tables
Для каждой из таблиц - show columns
и update по нужным полям.:)
-
В общем. Выполняя SQL-запрос, я получил 5591 запись, в которой содержится искомое вхождение...
Вот запрос:
select post from forum_posts where post like \'%creator.kiev.ua/iB_html%\' order by post limit 0, 20
что далее?
Вот в принципе небольшой скриптик по замене, но я не уверен, что он правильно отработает, а угробить базу мне бы не хотелось:
#!/usr/bin/perl
$sqlbase = "base_name";
$sqluser = "base_user";
$sqlpass = "base_passwd";
$table = "base_table_name";
use MySQL;
$db = Mysql->connect(\'localhost\', $sqlbase, $sqluser, $sqlpass);
$get = $db->query("SELECT post_id,topic_id,forum_id,post FROM $table");
while (($post_id,$topic_id,$forum_id,$post) = $get->fetchrow) {
$post =~ s|creator.kiev.ua/iB_html|unlimit.kiev.ua/ib|ig;
$post =~ s|enola.kiev.ua/iB_html|unlimit.kiev.ua/ib|ig;
$db->query("UPDATE $table SET post=$post WHERE post_id=$post_id AND topic_id=$topic_id AND forum_id=$forum_id");
}
exit;
может в нем что то не так?
-
Вот в принципе небольшой скриптик по замене, но я не уверен, что он правильно отработает, а угробить базу мне бы не хотелось:
Сделай dump базы,в случае чего восстановишся.
Можно попробовать замену на первых n записях, поставив LIMIT 0,n.
Проверить, и если все нормально прогнать по всем.
$post =~ s|creator.kiev.ua/iB_html|unlimit.kiev.ua/ib|ig;
$post =~ s|enola.kiev.ua/iB_html|unlimit.kiev.ua/ib|ig;
$post =~ s|creator\\.kiev\\.ua/iB_html|unlimit\\.kiev\\.ua/ib|ig;
$post =~ s|enola\\.kiev\\.ua/iB_html|unlimit\\.kiev\\.ua/ib|ig;
И на будущее - не стоит использовать модуль MySql поскольку он obsoleted. :)
-
А нифига. Скрипт не отработал. Сказал, что Internal Server Error 500... Что это может быть?
Вот полный скрипт:
#!/usr/bin/perl
$sqlbase = "base_name";
$sqluser = "base_user";
$sqlpass = "base_passwd";
$table = "base_table";
use MySQL;
$db = Mysql->connect(\'localhost\', $sqlbase, $sqluser, $sqlpass);
$get = $db->query("SELECT post_id,topic_id,forum_id,post FROM $table LIMIT 0,5");
while (($post_id,$topic_id,$forum_id,$post) = $get->fetchrow) {
$post =~ s|creator\\.kiev\\.ua/iB_html|unlimit\\.kiev\\.ua/ib|ig;
$post =~ s|enola\\.kiev\\.ua/iB_html|unlimit\\.kiev\\.ua/ib|ig;
$db->query("UPDATE $table SET post=$post WHERE post_id=$post_id AND topic_id=$topic_id AND forum_id=$forum_id");
}
exit;
-
Сказал, что Internal Server Error 500... Что это может быть?
Это он сказал, что было бы неплохо логи почитать :)
Поставь после use MySQL;
use CGI::Carp qw(fatalsToBrowser);
ЗЫ. Кстати, а чем DBI так не нравится?
-
Internal Server Error 500
1)в самом начале вставь
print "Content-type: text/html\\n\\n";
2) Возможно скрипт уже и отработал, а ошибка 500 только из-за отсутствия заголовков
-
скоростью работы...
при большом количестве записей скорость работы сиквела несколько высше чем с дби.
-
кстати, если скрипт работал с начала, с первой записи, где встречалось искомое вхождение, то он все же не отработал!
-
скоростью работы...
при большом количестве записей скорость работы сиквела несколько высше чем с дби.
Не может этого быть, посколькумодуль MySql реализован через DBI о чем явно написано в документации к нему.:))
кстати, если скрипт работал с начала, с первой записи, где встречалось искомое вхождение, то он все же не отработал!
В логах чего?
use CGI::Carp qw(fatalsToBrowser); - вставил?
-
логи то я не вижу! :( это надо снова прова дергать!
строку вставил!
Я думаю, ты уже догадался, что речь идет о форуме, а именно о iB3.0.2. Я регулярно общаюсь с одним из разработчиков оного, и то мне и сообщил, что с сиквеловской базой он будет работать несколько быстрее, но выигрыш можно получить только в слкчае, если база имеет "на борту" более 10 тыс. записей. Скажем так, я ему поверил на-слово, так как человек он авторитетный.
-
строку вставил!
И что происходит?
Я регулярно общаюсь с одним из разработчиков оного, и то мне и сообщил, что с сиквеловской базой он будет работать несколько быстрее, но выигрыш можно получить только в слкчае, если база имеет "на борту" более 10 тыс. записей.
А это я сейчас проверю, только сразу могу сказать - гонит.:)
Желающие подескутировать производительность DBI vsMysql
прошу - http://forums.webscript.ru/showthread.php?s=&threadid=5073
Только с аргументами.:))
-
И что происходит?
дык. а что должно произойти?
вклчается мой обработчик ошибок и выбрасывает \'500error.html\'... т.е. ошибка 500... все так же как и было!
ну а на счет гонит, не гонит. Ты эксперементировал? что то получилось?
-
дык. а что должно произойти?
CGI::Carp должен был выдать ошибку.
FTP, логин и пароль мне на мыло.
ну а на счет гонит, не гонит. Ты эксперементировал? что то получилось?
Гонит. См. http://forums.webscript.ru/showthread.php?s=&threadid=5073
Это результаты тестов.
-
CGI::Carp должен был выдать ошибку.
я только что убрал мой обработчик ошибок и получил тот же результат!
Internal Server Error.
The server encountered an internal error or misconfiguration and was unable to complete your request.
Это результаты тестов.
а каким количеством записей ты оперировал при проведении тестов?
-
Internal Server Error.
The server encountered an internal error or misconfiguration and was unable to complete your request.
Права доступа, путь к перл, установлен ли модуль Mysql.
Сам проверяй, если с этим все в порядке, то дальнейшие ошибки выдаст CGI::Carp.
Я уже сказал - кидай FTP, логин, пароль на мыло, я посмотрю.
а каким количеством записей ты оперировал при проведении тестов?
Там все написано. Но вообще 10995 в последнем тесте.:))