Forum Webscript.Ru

Общие => Базы данных => Тема начата: Creator от 09 Апреля 2002, 10:54:46

Название: Mass change in the mySQL base
Отправлено: Creator от 09 Апреля 2002, 10:54:46
Есть проблема, есть теория, но нет реального решения. Изложу в кратце...
Существует сиквеловская база (порядка 15тыс. записей). В базе где то около 20 таблиц, в среднем по 15 полей в каждой.
Цель: Нужно произвести выборку вхождений и произвести их замену. Например: есть запись "aaa.333.xxx*123" в которой нужно заменить вхождение "xxx*123" на "444-45-56", в результате чего должна получится запись типа "ааа.333.444-45-56".
Вот и пришли к вопросу: как это сделать?
база на уделенном сервере (Линукс), шелла нет, фтп доступ есть. cgi-bin соответственно тоже есть.
Название: Mass change in the mySQL base
Отправлено: fidget от 09 Апреля 2002, 11:10:00
Есть такая функция для строк, как REPLACE()
http://www.mysql.com/doc/S/t/String_functions.html

только одним MySQLем все равно не отделаешься ...
тебе вначале придется сделать выборку значений, которые ты апдейтить будешь, а потом уже делать апдейт в таблице...
Название: Mass change in the mySQL base
Отправлено: Chs от 09 Апреля 2002, 11:15:27
Цитировать
как это сделать?

Вариант раз: ручками. У меня, например, есть скрипт (перл) очень простой, реализующий интерфейс командной строки к MySql. Можно взять phpMyAdmin. И update по каждой из таблиц для нужных полей.

Вариант два: на любом языке реализуешь след. алгоритм.
show tables
Для каждой из таблиц - show columns
и update по нужным полям.:)
Название: Mass change in the mySQL base
Отправлено: Creator от 09 Апреля 2002, 12:37:00
В общем. Выполняя 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;

может в нем что то не так?
Название: Mass change in the mySQL base
Отправлено: Chs от 09 Апреля 2002, 13:41:18
Цитировать
Вот в принципе небольшой скриптик по замене, но я не уверен, что он правильно отработает, а угробить базу мне бы не хотелось:

Сделай 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. :)
Название: Mass change in the mySQL base
Отправлено: Creator от 09 Апреля 2002, 14:37:11
А нифига. Скрипт не отработал. Сказал, что 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;
Название: Mass change in the mySQL base
Отправлено: NeoNox от 09 Апреля 2002, 14:54:00
Цитировать
Сказал, что Internal Server Error 500... Что это может быть?

Это он сказал, что было бы неплохо логи почитать :)
Поставь после use MySQL;
use CGI::Carp qw(fatalsToBrowser);

ЗЫ. Кстати, а чем DBI так не нравится?
Название: Mass change in the mySQL base
Отправлено: Kostya от 09 Апреля 2002, 15:08:16
Цитировать
Internal Server Error 500

1)в самом начале вставь
print "Content-type: text/html\\n\\n";
2) Возможно скрипт уже и отработал, а ошибка 500 только из-за отсутствия заголовков
Название: Mass change in the mySQL base
Отправлено: Creator от 09 Апреля 2002, 15:09:45
скоростью работы...
при большом количестве записей скорость работы сиквела несколько высше чем с дби.
Название: Mass change in the mySQL base
Отправлено: Creator от 09 Апреля 2002, 15:17:56
кстати, если скрипт работал с начала, с первой записи, где встречалось искомое вхождение, то он все же не отработал!
Название: Mass change in the mySQL base
Отправлено: Chs от 09 Апреля 2002, 15:32:12
Цитировать
скоростью работы...
при большом количестве записей скорость работы сиквела несколько высше чем с дби.

Не может этого быть, посколькумодуль MySql реализован через DBI о чем явно написано в документации к нему.:))
Цитировать
кстати, если скрипт работал с начала, с первой записи, где встречалось искомое вхождение, то он все же не отработал!

В логах чего?
use CGI::Carp qw(fatalsToBrowser); - вставил?
Название: Mass change in the mySQL base
Отправлено: Creator от 09 Апреля 2002, 16:12:10
логи то я не вижу! :( это надо снова прова дергать!
строку вставил!

Я думаю, ты уже догадался, что речь идет о форуме, а именно о iB3.0.2. Я регулярно общаюсь с одним из разработчиков оного, и то мне и сообщил, что с сиквеловской базой он будет работать несколько быстрее, но выигрыш можно получить только в слкчае, если база имеет "на борту" более 10 тыс. записей. Скажем так, я ему поверил на-слово, так как человек он авторитетный.
Название: Mass change in the mySQL base
Отправлено: Chs от 09 Апреля 2002, 16:21:22
Цитировать
строку вставил!

И что происходит?

Цитировать
Я регулярно общаюсь с одним из разработчиков оного, и то мне и сообщил, что с сиквеловской базой он будет работать несколько быстрее, но выигрыш можно получить только в слкчае, если база имеет "на борту" более 10 тыс. записей.

А это я сейчас проверю, только сразу могу сказать - гонит.:)

Желающие подескутировать производительность DBI vsMysql
прошу - http://forums.webscript.ru/showthread.php?s=&threadid=5073
Только с аргументами.:))
Название: Mass change in the mySQL base
Отправлено: Creator от 09 Апреля 2002, 22:01:02
Цитировать
И что происходит?

дык. а что должно произойти?
вклчается мой обработчик ошибок и выбрасывает \'500error.html\'... т.е. ошибка 500... все так же как и было!

ну а на счет гонит, не гонит. Ты эксперементировал? что то получилось?
Название: Mass change in the mySQL base
Отправлено: Chs от 09 Апреля 2002, 22:36:47
Цитировать
дык. а что должно произойти?

CGI::Carp должен был выдать ошибку.
FTP, логин и пароль мне на мыло.
Цитировать
ну а на счет гонит, не гонит. Ты эксперементировал? что то получилось?

Гонит. См.  http://forums.webscript.ru/showthread.php?s=&threadid=5073
Это результаты тестов.
Название: Mass change in the mySQL base
Отправлено: Creator от 09 Апреля 2002, 22:57:23
Цитировать
CGI::Carp должен был выдать ошибку.

я только что убрал мой обработчик ошибок и получил тот же результат!

Internal Server Error.
The server encountered an internal error or misconfiguration and was unable to complete your request.

Цитировать
Это результаты тестов.

а каким количеством записей ты оперировал при проведении тестов?
Название: Mass change in the mySQL base
Отправлено: Chs от 09 Апреля 2002, 23:06:10
Цитировать
Internal Server Error.
The server encountered an internal error or misconfiguration and was unable to complete your request.

Права доступа, путь к перл, установлен ли модуль Mysql.
Сам проверяй, если с этим все в порядке, то дальнейшие ошибки выдаст CGI::Carp.

Я уже сказал - кидай FTP, логин, пароль на мыло, я посмотрю.
Цитировать
а каким количеством записей ты оперировал при проведении тестов?

Там все написано. Но вообще 10995 в последнем тесте.:))