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–2024 Art. Lebedev Studio | http://www.artlebedev.ru Дата обновления: 26.09.2024