connect. Подключение к базе данных

^connect[строка подключения]{код}

Оператор
connect осуществляет подключение к серверу баз. Код оператора обрабатывается Parser, работая с базой данных в рамках установленного подключения.

Parser (в виде модуля к Apache или IIS) кеширует соединения с SQL-серверами, и повторный SQL запрос на соединение с той же строкой подключения не производится, а соединение берется из кеша, если оно еще действительно.

Вариант CGI также кеширует соединение, но только на один
http запрос (обработка одного документа), поэтому явно допустимы конструкции вида:

^connect[строка подключения]{…первый SQL запрос…}
^connect[строка подключения]{…второй 
SQL запрос…}

При этом не будет двух соединений, и это полезно, когда, скажем, изредка соединение нужно, и заранее неизвестно нужно или нет - заранее его можно не делать, а делать визуально многократно, зная, что оно фактически не разрывается.

Передать SQL-запрос БД может один из следующих методов или конструкторов языка Parser:

table::sql
string:sql
void:sql
hash::sql
int:sql
double:sql
file::sql

Замечание: для работы оператора connect необходимо наличие настроенного драйвера баз данных (см. раздел Настройка).   

Форматы строки соединения для поддерживаемых серверов баз данных описаны в приложении.

Пример
^connect[mysql://admin:pwd@localhost/p3test]{
   $news[^
table::sql{select * from news}]
}



User comments:

G_Z 17.05.2017 22:48

Существует тонкость работы функции ROW_COUNT() в MySQL при использовании кэшированных соединений: драйвер посылает команду ping при использовании закэшированного соединения, при получении которой MySQL очищает счётчик затронутых строк (https://dev.mysql.com/doc/refman/5.7/en/mysql-ping.html).

Таким образом, можно получить неожиданный результат (0):
^connect[…]{
^void:sql{INSERT INTO …}
}

^connect[…]{
$affected(^int:sql{SELECT ROW_COUNT()})
}

Чтобы этого избежать необходимо явно использовать общее соединение для выполнения модифицирующих запросов и запроса получения количества затронутых строк:
^connect[…]{
^void:sql{INSERT INTO …}

$affected(^int:sql{SELECT ROW_COUNT()})
}


G_Z 17.01.2016 21:58

По версию 3.4.4 вложенные соединения не кэшируются:
^connect[строка подключения]{
…первый SQL запрос…

^connect[строка подключения]{…второй SQL запрос…}
}

Установится два соединения.

http://www.parser.ru/forum/?id=82393


In order to add comments you must register.
Copyright © 1997–2021 Art. Lebedev Studio | http://www.artlebedev.ru Дата обновления: 23.04.2016