Заметки · 21.11.2025

IDE Lazarus и PostgreSQL

Разработка тестового проекта велась на IDE Lazarus версии 3.6, а PostgreSQL использовалась 16 версии. Разумеется оба пакета являются 64-разрядными. При разработке в Linux потребуется установка зависимостей для разработки в связке с СУБД PostgreSQL.

Итак, на повестке этой пятницы PostgreSQL и IDE Lazarus. Попробуем подключиться к базе данных postgres и запросить из неё данные. Например, спросим у базы данных какой порт прослушивается СУБД и получим его описание. Оговорюсь, что я не подключал никаких дополнительных модулей, не занимался внедрением экстравагантных пакетов и пересборкой IDE, а просто кинул на форму изкоробочный компонент TPQConnection и понеслось.

Прежде всего, методом исключения, я определил перечень необходимых динамических библиотечек, которые нам потребуются для работы с PostgreSQL 16:

libcrypto-3-x64.dll
libiconv-2.dll
libintl-9.dll
libpq.dll
libssl-3-x64.dll
libwinpthread-1.dll

Их необходимо разместить в папке с проектом, иначе чуда не произойдёт. Библиотеки зазипую и выложу отдельным архивом.

Для тестового проекта ограничимся одной формой, тремя компонентами и двумя процедурами. Бросаем на форму вот эти штуки:

Кто есть кто, указано здесь:

postgre:=TPQConnection.Create(nil);
query:=TSQLQuery.Create(nil);
transaction:=TSQLTransaction.Create(nil);

Я умышленно обозвал компонент TPQConnectionpostgre, чтобы не запутаться в процессе написания кода. Мне ещё предстояло нагородить комментариев, так что решил начать с минимализма.

Основной модуль проекта в редакторе исходного кода выглядит так:

unit postgretest_unit;

{$mode objfpc}{$H+}

interface

uses
  SysUtils,
  PQConnection,
  SQLDB,
  Forms,
  Graphics,
  Dialogs;

type

  { TForm1 }

  TForm1 = class(TForm)

    // Объекты
    postgre: TPQConnection;
    query: TSQLQuery;
    transaction: TSQLTransaction;

    // Процедуры
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    procedure FormCreate(Sender: TObject);

  private

  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

// Создание формы
procedure TForm1.FormCreate(Sender: TObject);
var
  // Переменная для получения порта
  PortValue: string;
  // Переменная для описания
  DescriptionValue: string;
  // Переменная для запроса
  SQLQuery: string;
begin

  // Создаём объекты
  postgre:=TPQConnection.Create(nil);
  query:=TSQLQuery.Create(nil);
  transaction:=TSQLTransaction.Create(nil);

  try
    // Запрос
    SQLQuery:='SELECT setting, short_desc FROM pg_settings WHERE name = ''port''';
    // Настройка соединения
    postgre.HostName:='localhost';
    postgre.DatabaseName:='postgres';
    postgre.UserName:='postgres';
    postgre.Password:='VeryStrongPassword';
    postgre.Params.Values['port']:='5432';
    postgre.Transaction:=transaction;
    transaction.DataBase:=postgre;
    query.DataBase:=postgre;
    postgre.Open;
    // Подключаемся к базе данных
    if postgre.Connected then
    begin
      // Выведем сообщение об успешном подключении
      ShowMessage('Подключено!');
      // Покрасим форму в лаймовый цвет
      Self.Color:=clLime;
      // Зададим заголовок формы
      Self.Caption:='Успешно подключились к ' + postgre.DatabaseName;
      // Начало транзакции
      transaction.StartTransaction;
      try
        // Текст запроса
        query.SQL.Text:=SQLQuery;
        // Выполнение запроса
        query.Open;
        // Проверка результата
        if not query.IsEmpty then
        begin
          // Получение значений
          PortValue:=query.FieldByName('setting').AsString;
          DescriptionValue:=query.FieldByName('short_desc').AsString;
          // Вывод сообщения с результатом запроса
          ShowMessage('Значение порта: ' + PortValue
                       + sLineBreak +
                       'Описание: ' + DescriptionValue);
        end
        else ShowMessage('Результаты запроса пусты.');
        // Завершение транзакции
        transaction.Commit;
      except
        on E: Exception do
        begin
          // Откат транзакции в случае ошибки
          transaction.Rollback;
          // Вывод сообщения об ошибке
          ShowMessage('Ошибка: ' + E.Message);
        end;
      end;
    end
    else ShowMessage('Не удалось подключиться к базе данных.');
  except
    on E:Exception do ShowMessage('Ошибка подключения: ' + E.Message);
  end;
end;

// Закрытие формы и освобождение ресурсов
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  query.Free;
  transaction.Free;
  postgre.Close();
  postgre.Free;
end;

end.

Если уточнить настройки соединения, согласно Вашему окружению, и запустить проект — то можно полюбоваться на такое окошко:

После нажатия на ОК получим другое окно с данными о текущем порте СУБД:

Вновь ОК и получим форму, залитую лаймовым цветом, как указано здесь:

// Покрасим форму в лаймовый цвет
   Self.Color:=clLime;

По сути дела, это вся наука базового подключения к серверу баз данных PostgreSQL. Осталось только доработать код под Ваши потребности: вынести что-то в отдельные функции, добавить метод освобождения ресурсов, проверку пустоты запросов и добавить щепотку магии транзакций.