Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ perl+mysql

Автор: klem4 17.06.2008 22:13

Всем привет.

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

Код

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 17.06.2008 22:57

Возникла другая проблема, есть скрипт файл, содержащий несколько 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 17.06.2008 23:35

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

Код
@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";
  }

Автор: klem4 18.06.2008 1:10

Продолжение эпопеи ... вот тут уже совсем незнаю что делать, вот пример: 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

Автор: klem4 18.06.2008 1:43

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;