IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> perl+mysql
сообщение
Сообщение #1


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Всем привет.

Вот такой код отрабатывает нормально:

Код

use Mysql;
// ...
$dbh = Mysql -> connect (
    $host,
    $database,
    $user,
    $password
  ) || die "\nCan't connect to MYSQL\nReason: $DBI::errstr\n";
// ...
$query = $dbh -> Query (
   "$script"
  ) || die "\nCan't excute statement '$script'\nReason: $DBD::errstr\n";


А вот такой, выдает ошибку (на execute) "No database selected"

Код
use DBI; // <--------
//...
$dbh = DBI -> connect (
    "DBI:mysql:database = $database; $host = $host",
    $user,
    $password
  ) || die "\nCan't connect to MYSQL\nReason: $DBI::errstr\n";
//...
$query = $dbh -> prepare (
   "$script"
  ) || die "\nCan't prepare statement '$script'\nReason: DBI::errstr\n";
  
  print "\n -- Prepare is ok.\n";
  
  $query -> execute
    || die "\nCan't execute statement '$script'\nReason: $DBI::errstr\n";
    
  print "\n Executing is ok.\n";


Почему ? Я понимаю что вроде как не выбрана база, но при use Mysql, можно использовать SelectDB, но работает и без этого, а при use DBI что нужно сделать чтобы выбрать базу ? Я думал что в строке connect'a это прописывается, видимо нет.

Добавлено через 16 мин.
Проблема решена.

Убрал пробелы из этой строчки:
Код
"DBI:mysql:database=$database;host=$host"


Сообщение отредактировано: klem4 -


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Возникла другая проблема, есть скрипт файл, содержащий несколько SQL-запросов, например вот такой:

Цитата(create.sql)
CREATE TABLE PRODUCTS (
PRODUCT_ID int NOT NULL,
PRODUCT_NAME varchar(40) NOT NULL,
PRIMARY KEY (PRODUCT_ID)
);

CREATE UNIQUE INDEX idx_product_name ON PRODUCTS
(
PRODUCT_NAME
);


Я считываю его в переменную

Код

$/ = undef;
$script = <script_file>;


И хочу выполнить:
Код

  $query = $dbh -> prepare (
   "$script"
  ) || die "\nCan't prepare statement '$script'\nReason: $DBI::errstr\n";
  
  print "\n -- Prepare is ok.\n";
  
  $query -> execute
    || die "\nCan't execute statement \nReason: $DBI::errstr\n";


вываливается с криками об ошибке в синтаксисе SQL-запроса, начиная с 'CREATE UNIQUE INDEX ...'

В файла 2 запроса, по одиночке выполняются отлично, но вместе подрят никак ... чувствую дело в диалексте или еще в чем, пробовал убирать ';' не помогло, ничего в голову не приходит пока.

Сообщение отредактировано: klem4 -


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


В общем решил проблему вот так:

Код
@scripts = split(/;/, $script);
  $statement = 0;
  
  foreach (@scripts)
  {
      print "\n[",++$statement, " statement starting]\n";
      
      $query = $dbh -> prepare (
       "$_"
      ) || die "\nCan't prepare statement '$script'\nReason: DBI::errstr\n";
  
      print "\n -- Prepare is ok.\n";
  
      $query -> execute
        || die "\nCan't execute statement \nReason: $DBI::errstr\n";
    
      print "\n --Executing is ok.\n";
  }


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Продолжение эпопеи ... вот тут уже совсем незнаю что делать, вот пример: 2 простейшие таблицы, связь 1 ко многим по table1_id

Код
CREATE TABLE TABLE_1 (
       TABLE1_ID            int unsigned unique NOT NULL auto_increment,
       TABLE1_DATA          varchar(20) NULL,
       PRIMARY KEY (TABLE1_ID)
) type=innodb;

create unique index idx on table_1(
  TABLE1_ID
);
CREATE TABLE TABLE_2 (
       TABLE2_ID            int NOT NULL,
       TABLE1_ID            int unsigned NOT NULL,
       TABLE2_DATA          varchar(20) NULL,
       PRIMARY KEY (TABLE2_ID),
       FOREIGN KEY (TABLE1_ID)
                             REFERENCES TABLE_1
) type=innodb;


пишет, что "Can't create table_2.frm (errno: 150)"

все перепробовал, добавил unsigned, обеим проставил type=innodb, добавил индекс по ключу первой таблицы ... wacko.gif


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


smile.gif Вот оно как должно быть:

Код
CREATE TABLE TABLE_1 (
       TABLE1_ID            int not null auto_increment,
       TABLE1_DATA          varchar(20) NULL,
       PRIMARY KEY (TABLE1_ID)
) engine=innodb;

CREATE TABLE TABLE_2 (
       TABLE2_ID            int NOT NULL auto_increment,
       TABLE2_DATA          varchar(20) NULL,
       TABLE1_ID           int not null,
       index idx(TABLE1_ID),
       PRIMARY KEY (TABLE2_ID),
       FOREIGN KEY (TABLE1_ID)
                             REFERENCES TABLE_1(TABLE1_ID) on delete restrict
) engine=innodb;


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 27.10.2020 10:34
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name