Модераторы: ginnie, korob2001
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск одинаковых таблиц или полей в mysql, найти одинаковые имена таблиц или создат 
V
    Опции темы
Strafer
Дата 15.4.2008, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 15.4.2008

Репутация: нет
Всего: нет



Задача найти среди имеющихся имён таблиц совпадение с текущим, если такогового нет то создать
пробывал нечто типа 
Код

     my $dblist = $db->prepare("SHOW TABLES");
     my $tmplogin = $dblist->execute;
     $tmplogin = $dblist->fetchrow_array;
   if ($login lt $tmplogin)
     {
           $dblist = $db->do("INSERT INTO $login VALUES(................)");
     }
   else {
               $dblist = $db->do("CREATE TABLE $login (.....................)");
               $dblist = $db->do("INSERT INTO $login VALUES(................)");
               print "Table $login create\n";
     }

хотя как сравнить 2 переменные типа char незнаю
P.S. Perl учу только вторую неделю
PM MAIL ICQ   Вверх
Itsys
Дата 16.4.2008, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: нет
Всего: 34



eq - равно, ne - не равно, тебе надо lt заменить на eq
mySQL не знаю, поэтому по поводу запросов подсказать не могу
PM MAIL WWW Skype   Вверх
shamber
Дата 16.4.2008, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 1
Всего: 18



Strafer, есть такая штука
Код

CREATE TABLE IF NOT EXISTS tbl_name


создает если не существует
PM MAIL Jabber   Вверх
Strafer
Дата 16.4.2008, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 15.4.2008

Репутация: нет
Всего: нет



Цитата(shamber @ 16.4.2008,  13:21)
Strafer, есть такая штука
Код

CREATE TABLE IF NOT EXISTS tbl_name


создает если не существует

Я знаю что такое есть, пробывал реализовывать так но меня застопорила следующая ситуация .........
ладно расскажу принцип действия может будет понятно 
есть лог который пишет Pure-FTPd выглядит он примерно так
Код

<IP or host> <login> [localtime] "<GET or PUT> <path to file>" <status> <size of file>

моя задача сделать скипрт который будет по крону читать лог и вносить данные в БД MySQL
Код

while(<FTPD>)#построчное чтение лога Pure-FTPd
        {
     my ($IP, $notuse, $login, $data, $time, $timezone, $method, $pathtofile, $status, $bytes) = /^(\S+) (\S+) (\S+) \[([^:]+):(\d+:\d+:\d+) ([^\]]+)\]\ "(\S+) (.+?)" (\S+) (\S+)$/;
     #тестовый код
     my $dblist = $db->prepare("SHOW TABLES");
     my $tmplogin = $dblist->execute;
        $tmplogin = $dblist->fetchrow_array;
        print "tmplogin \t $tmplogin\n";
      }
#считаем кол-во строк в таблице
     my $listnum = $db->prepare("SELECT * FROM ftp");
     $listnum->execute;
     my $j=$listnum->rows;
     print "rows \t $j\n";
#     my $dbadd = $db->do("CREATE TABLE IF NOT EXISTS $login (nmbline INT(4) NOT NULL AUTO_INCREMENT, data VARCHAR (20) BINARY NOT NULL, time VARCHAR(8) BINARY NOT NULL, host VARCHAR(25) BINARY NOT NULL, method VARCHAR(4) BINARY NOT NULL, pathtofile VARCHAR(250) BINARY NOT NULL, bytes INT(10) NOT NULL default \"1\", Primary key (nmbline) )");

это кусок кода из еще отлаживаемого скрипта для каждого логина создаётся таблица и в этой таблице нумируются строки ибо в дальней реализации должно будет быть предусмотрено что данные хранятся не безразмерно, а только за последний год (не календарный а именно 365 дней)
P.S. это часть дипломной работы, в данном случае подходит такая ассоциация  smile ибо две недели Я учу perl по книге "Perl за 24 часа"............
вот такое задание
вопрос снимаю понял всю его тупость 
Код

#считаем кол-во строк в таблице
     my $listnum = $db->prepare("SELECT * FROM $login");
     $listnum->execute;
     my $j=$listnum->rows;
#если количество строк -1 значит такой таблицы не существует т.е нет такого пользователя.
    if ( $j == -1)
    {
#создаём пользователя и вносим его данные;
     my $dbadd = $db->do("CREATE TABLE IF NOT EXISTS $login (nmbline INT(4) NOT NULL AUTO_INCREMENT, data VARCHAR (20) BINARY NOT NULL, time VARCHAR(8) BINARY NOT NULL, host VARCHAR(25) BINARY NOT NULL, meth
od VARCHAR(4) BINARY NOT NULL, pathtofile VARCHAR(250) BINARY NOT NULL, bytes INT(10) NOT NULL default \"1\", Primary key (nmbline) )");
     $dbadd = $db->do("INSERT INTO $login VALUES(1, '$data', '$time', '$IP', '$method', '$pathtofile', $bytes)");
     print LOGF scalar(localtime), "Add new user:\b", $login, "\n";
    }
    else {
     $j=$j+1; #увеличиваем счётчик номера строки
     my $dbinsert = $db->do("INSERT INTO $login VALUES($j, '$data', '$time', '$IP', '$method', '$pathtofile', $bytes)");
        }
}

"правилный" код написал в случае если кому то чем то пригодится

Это сообщение отредактировал(а) Strafer - 17.4.2008, 17:32
PM MAIL ICQ   Вверх
yura_nev
Дата 22.4.2008, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 28.12.2007

Репутация: нет
Всего: нет



ниже - всего лишь мое ХО...

Strafer, если это заметят - снизят оценку (я бы двойку поставил сразу, не в обиду) smile не стоит так таблицы создавать.
нужно создать таблицу логов а в ней просто держать login_id, а логины держать в отдельной таблице. Хотя, конечно если в таблице будет 10 млн записей то это имеет смысл для mysql.
а нумерация строк, - это что такое?? ведь вы записываете дату и время (их кстати нужно записывать не отдельнов виде строк, а в виде TIMESTAMP)! есть же ORDER BY, LIMIT, DATE_ADD(), куча функций MYSQL позволяющий работать с датами.

PM MAIL   Вверх
Strafer
Дата 23.4.2008, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 15.4.2008

Репутация: нет
Всего: нет



yura_nev,  даты записаны в виде строк т.к. это даты из самого лога. По поводу отдельной таблицы с логинами хорошая идея спасибо за подсказку. Это кстати исправит появление предупреждений после выполнения 
Код

my $listnum = $db->prepare("SELECT * FROM $login");

на STDOUT выдаёт ошибку самого мускуля о том что нет такой таблицы.
P.S. понял к чему было сказано про отметкувремени вместо номеров строк еще раз спасибо

Это сообщение отредактировал(а) Strafer - 23.4.2008, 16:15
PM MAIL ICQ   Вверх
Strafer
Дата 23.4.2008, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 15.4.2008

Репутация: нет
Всего: нет



я канешна понимаю что тема уже меняет смысл, но все же
Код

CREATE TABLE `testftp`.`login`(
 `login_id` INT AUTO_INCREMENT NOT NULL,
 `logins` VARCHAR(16) BINARY NOT NULL,
  PRIMARY KEY (login_id, logins)
)ENGINE=InnoDB CHARACTER SET=UTF8;
CREATE TABLE IF NOT EXISTS `testftp`.`test` (
 `current_data` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
 `log_date` VARCHAR( 10 ) NOT NULL ,
 `log_time` VARCHAR( 8 ) NOT NULL ,
 `login_id` INT NOT NULL,
 `host` VARCHAR( 25 ) NOT NULL ,
 `method` VARCHAR( 4 ) NOT NULL ,
 `path_to_file` VARCHAR( 250 ) NOT NULL ,
 `size_of_file` INT( 10 ) NOT NULL,
 PRIMARY KEY (current_data),
 FOREIGN KEY (login_id) REFERENCES login(login_id)
 ON UPDATE CASCADE
 ON DELETE RESTRICT
)ENGINE=InnoDB CHARACTER SET=UTF8;

это реализация идеи с отдельной таблицей для логинов дальше продвинутся неудалось

yura_nev, подскажи пожайлуста или на словах или как переписать код под изменившийся вид таблицы а БД ибо идей ноль
PM MAIL ICQ   Вверх
yura_nev
Дата 25.4.2008, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 28.12.2007

Репутация: нет
Всего: нет



ммм.. по порядку.. 
1) насчет дат из лога. я насколько понимаю они в формате YYYY-MM-DD HH:MM:SS
соответсвенно все просто, в базе делаем log_date TIMESTAMP, log_time убираем, b инсертим в виде строки "$data $time" (вообще надо и из регэкспа все это в одну перeменную тянуть, можно и вместе с тайм-зоной, mysql не дурак, сам разберется)

2) PRIMARY KEY для таблицы Login должен быть _только_ login_id

3) для таблицы test PRIMARY KEY  можно вообще не устанавливать, либо завести фиктивный id с auto_increment'ом
обязательно сделать INDEX(log_date)... ну и по всем полям (отдельно!), по которым будет поиск.
Поле current_data - убрать (зачем оно вообще?).

4) не понял что тебе не понятно как переписать. инсерт в таблицу test что ли?
на словах так:
 создаешь хеш вида login_name => login_id, чтоб по имени узнавать ID (в начале подгружаешь из таблицы Login)
 когда пойдешь по логу, перед каждм инсертом заглядываешь в этот хеш и смотришь есть ли там такой логин. если нет, добавляешь новый логин в таблицу логинов, и заносишь айдишник в хеш.
 вставляешь запись в test с login_id вытащенным из хеша.

PM MAIL   Вверх
Strafer
Дата 2.5.2008, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 15.4.2008

Репутация: нет
Всего: нет



написал вот такой код ошибок не выдаёт но и ИМХО не работает 
Код
  
my $dbsearch = $db->prepare("SELECT * FROM login");      
$dbsearch->execute;     
 while (my @tmplogin = $dbsearch->fetchrow_array)    
  {
      if ($login eq $tmplogin[1]) 
{ my $dbinsert = $db->do("INSERT INTO  test VALUES(......$tmplogin[0]........)");
 } 
else {
$dbinsert=$db->do("INSERT INTO login VALUES(.........)");
 $dbinsert = $db->do("INSERT INTO test VALUES(...........LAST INSERT ID(), ..................)"); 
 } 
} 
 
пробывал вместо запросов к БД писать просто 
Код
print $tmplogin[1]; 
 чтобы увидеть что именно находится в переменной в результате ничего не происходит и на экран не выдаёт :(

P.S.почистил и пересоздал  БД, работает только зацикливается как от это избавится ????

Это сообщение отредактировал(а) Strafer - 3.5.2008, 19:50
PM MAIL ICQ   Вверх
yura_nev
Дата 4.5.2008, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 28.12.2007

Репутация: нет
Всего: нет



надо сделать примерно так
Код
use DBIx::ContextualFetch;

# До обработки логов
my $dbsearch = $db->prepare("SELECT logins, login_id FROM login");      
$dbsearch->execute;
my $logins = { map {@{$_}} $dbsearch->fetchall };

#...

# Обработка логов
unless(exists $logins->{$login}) {
    $db->do("INSERT INTO login VALUES(.........)");
    my $sth = $db->prepare("SELECT LAST_INSERT_ID()");
    $sth->execute;
    ($logins->{$login}) = $sth->fetchrow_array or die "Shit happened: ".$db->errstr;
}
$db->do("INSERT INTO  test VALUES(......$logins->{$login}........)")

PM MAIL   Вверх
Strafer
Дата 4.5.2008, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 15.4.2008

Репутация: нет
Всего: нет



Ого мне чтобы дойти до таких навыков пришлось не одну книгу прочитать и побольше практики
пришлось доустановить perl-DBIx-ContextualFetch и еще мне выдало что fetchall нет такого, зато оно заменяется на fetchrow_arrayref
Спасибо дружище Ты меня спас честное слово
PM MAIL ICQ   Вверх
yura_nev
Дата 5.5.2008, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 28.12.2007

Репутация: нет
Всего: нет



не заменяется, если заменить то вместо всех логинов получишь только один.
надо просто в DBI->connect()'е в поледний параметр (тот что HASHREF) добавить
Код
RootClass => "DBIx::ContextualFetch"


Это сообщение отредактировал(а) yura_nev - 5.5.2008, 17:59
PM MAIL   Вверх
Strafer
Дата 6.5.2008, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 15.4.2008

Репутация: нет
Всего: нет



странно, но даже без добавления этого кода все работает и с добавлением работает
щас пытался прикрутить интерфейс который я писал на php и заметил что логины записаны в виде hex string тобишь
Код

INSERT INTO `testftp`.`login` VALUES  
(1,0x73747261666572),
 (2,0x723235),
 (3,0x723032),
 (4,0x723137),
 (5,0x723136),
 (6,0x723430),
 (7,0x723036),
 (8,0x723332),
 (9,0x723333),
 (10,0x723139),
 (11,0x723237),
 (12,0x723138),
 (13,0x723130),
 (14,0x723330),
 (15,0x723434),
 (16,0x723532),
 (17,0x723038),
 (18,0x723033),
 (19,0x723337),
...................................

это данные сделаные дампом, а это 
Код

mysql> SELECT * FROM login;
+----------+---------+
| login_id | logins  |
+----------+---------+
|        1 | strafer | 
|        2 | r25     | 
|        3 | r02     | 
|        4 | r17     | 
|        5 | r16     | 
|        6 | r40     | 
|        7 | r06     | 
|        8 | r32     | 
|        9 | r33     | 
|       10 | r19     | 
|       11 | r27     | 
|       12 | r18     | 
|       13 | r10     | 
|       14 | r30     | 
|       15 | r44     | 
|       16 | r52     | 
.....................................

простым просмотром. Так что сейчас пытаюсь сделать так чтобы php видел все красиво а не кучу цифирок
P.S. главно что лог парсится без ошибок
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: Системное программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к системному программированию на Perl
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0548 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.