В руководстве пользователя указано, что вы должны сначала сгенерировать типы данных Ada, которые представляют сущности (таблицы, поля и т. Д. c.) Базы данных, с которой вы взаимодействуете, чтобы использовать такие функции, как SQL_Select
. Это можно сделать с помощью утилиты gnatcoll_db2ada
(см. здесь ); либо путем некоторого отражения в базе данных, либо путем предоставления рукописной схемы (пример в руководстве пользователя). Вот мои собственные шаги по созданию примера.
Установить зависимости:
$ sudo apt-get install postgresql libpq-dev
Создать пользователя базы данных (здесь: deedee
):
$ sudo -u postgres bash
postgres@debian: $ createuser --pwprompt deedee
Клонировать gnatcoll-db
:
$ git clone https://github.com/AdaCore/gnatcoll-db.git
Сборка и установка gnatcoll-sql
:
gnatcoll-db/sql $ make setup
gnatcoll-db/sql $ make
gnatcoll-db/sql $ sudo bash -c "PATH=$PATH:/opt/GNAT/2019/bin make install"
Сборка и установка gnatcoll-postgress
:
gnatcoll-db/postgress $ make setup
gnatcoll-db/postgress $ make
gnatcoll-db/postgress $ sudo bash -c "PATH=$PATH:/opt/GNAT/2019/bin make install"
Сборка и установка gnatcoll_db2ada
:
gnatcoll-db/gnatcoll_db2ada $ make setup DB_BACKEND=postgres
gnatcoll-db/gnatcoll_db2ada $ make
gnatcoll-db/gnatcoll_db2ada $ sudo bash -c "PATH=$PATH:/opt/GNAT/2019/bin make install"
Утилита будет установлена рядом со всеми другими программами GNAT:
$ which gnatcoll_postgres2ada
/opt/GNAT/2019/bin/gnatcoll_postgres2ada
Чтобы использовать утилиту, я сначала создал небольшую базу данных, используя предоставленные вами данные. Я воссоздал таблицу persons
, используя команды:
$ sudo -u postgres bash
postgres@debian: $ createdb mydb1
postgres@debian: $ psql mydb1 < persons.sql
с
человек. sql
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE TYPE gender AS ENUM ('Male', 'Female');
CREATE TABLE persons (
person_uid uuid DEFAULT uuid_generate_v4 () PRIMARY KEY,
first_name VARCHAR (20) NOT NULL,
last_name VARCHAR (20) NOT NULL,
gender gender NOT NULL,
email VARCHAR (50) NOT NULL,
date_of_birth DATE NOT NULL,
country_of_birth VARCHAR (20) NOT NULL
);
INSERT INTO persons (
first_name,
last_name,
gender,
email,
date_of_birth,
country_of_birth
)
VALUES
('Audrie' , 'Vasyukov' , 'Female', 'avasyukovd6@domainmarket.com', '1988-11-24', 'Guatemala'),
('Nefen' , 'Philippard', 'Male' , 'nphilippardd7@economist.com' , '2006-11-08', 'Russia' ),
('Leonore', 'Garthland' , 'Female', 'lgarthlandd8@furl.net' , '1991-03-23', 'Canada' ),
('Yank' , 'Turfitt' , 'Male' , 'yturfittd9@exblog.jp' , '1990-02-07', 'China' ),
('Benn' , 'Pawley' , 'Male' , 'bpawleyda@indiegogo.com' , '2006-10-28', 'Russia' ),
('Tod' , 'Easen' , 'Male' , 'teasend4@php.net' , '1990-08-24', 'China' );
GRANT SELECT ON persons TO deedee;
Затем я создал схему базы данных (см. руководство пользователя) и сгенерировал код Ada:
$ gnatcoll_postgres2ada -dbmodel dschema.txt
$ ls
database.adb database.ads database_names.ads dschema.txt
с
dschema.txt
| TABLE | persons | || The contents of person |
| person_uid | TEXT | PK || Auto-generated id |
| first_name | TEXT | NOT NULL || First name |
| last_name | TEXT | NOT NULL || Last name |
| gender | TEXT | NOT NULL || Gender |
| email | TEXT | NOT NULL || E-mail address |
| date_of_birth | DATE | NOT NULL || Date of birth |
| country_of_birth | TEXT | NOT NULL || Country of birth |
Я наконец добавил файл конфигурации трассировки (на основе примера в руководстве пользователя GNATcoll), адаптировал ваш пример кода и заставил его работать с моей собственной таблицей:
.gnatdebug (записать информацию трассировки в стандартную ошибка; обозначается >&2
)
>&2
SQL.yes
SQL.SELECT=yes
SQL.LITE=yes
default.gpr
with "gnatcoll_postgres.gpr";
project Default is
for Source_Dirs use ("src");
for Object_Dir use "obj";
for Main use ("main.adb");
end Default;
main.adb
with Ada.Text_IO; use Ada.Text_IO;
with GNATCOLL.Traces; use GNATCOLL.Traces;
with GNATCOLL.SQL.Postgres; use GNATCOLL.SQL.Postgres;
with GNATCOLL.SQL.Exec; use GNATCOLL.SQL.Exec;
with GNATCOLL.VFS; use GNATCOLL.VFS;
with GNATCOLL.SQL.Inspect; use GNATCOLL.SQL.Inspect;
with GNATCOLL.SQL; use GNATCOLL.SQL;
with Database;
procedure Main is
-- Datebase Description
DB_Descr : GNATCOLL.SQL.Exec.Database_Description;
-- Database Connection
DB : GNATCOLL.SQL.Exec.Database_Connection;
-- Used to Query the data
Q : SQL_Query;
begin
-- Enable tracing, so we can see if something goes wrong.
GNATCOLL.Traces.Parse_Config_File (".gnatdebug");
-- Database description.
DB_Descr := GNATCOLL.SQL.Postgres.Setup
(Database => "mydb1",
User => "deedee",
Host => "localhost",
Password => "xxxx");
-- Database connection.
DB := DB_Descr.Build_Connection;
-- Define the query.
Q := SQL_Select
(Fields =>
Database.Persons.Person_Uid & -- 0
Database.Persons.First_Name & -- 1
Database.Persons.Last_Name & -- 2
Database.Persons.Gender & -- 3
Database.Persons.Email & -- 4
Database.Persons.Date_Of_Birth & -- 5
Database.Persons.Country_Of_Birth, -- 6
From => Database.Persons);
declare
R : Forward_Cursor;
begin
-- Perform the actual query, show results if OK.
R.Fetch (DB, Q);
if Success (DB) then
while Has_Row (R) loop
Put_Line ("UUID . . : " & Value (R, 0));
Put_Line ("Name . . : " & Value (R, 1) & " " & Value (R, 2));
Put_Line ("Gender . : " & Value (R, 3));
Put_Line ("E-Mail . : " & Value (R, 4));
Put_Line ("Birth. . : " & Value (R, 5) & ", " & Value (R, 6));
New_Line;
Next (R);
end loop;
else
Put_Line ("FAILED");
end if;
end;
Free (DB); -- for all connections you have opened
Free (DB_Descr);
GNATCOLL.Traces.Finalize;
end Main;
сборка и вывод
$ gprbuild -P default.gpr
[...]
$ ./obj/main
[SQL.SELECT] SELECT persons.person_uid, persons.first_name, persons.last_name, persons.gender, persons.email, persons.date_of_birth, persons.country_of_birth FROM persons (6 tuples) PGRES_TUPLES_OK
UUID . . : 564b6d18-5f99-4d6b-8098-d5ce79910107
Name . . : Audrie Vasyukov
Gender . : Female
E-Mail . : avasyukovd6@domainmarket.com
Birth. . : 1988-11-24, Guatemala
UUID . . : a4c2743a-40ad-409e-9af7-f21e7b91da05
Name . . : Nefen Philippard
Gender . : Male
E-Mail . : nphilippardd7@economist.com
Birth. . : 2006-11-08, Russia
UUID . . : 04aa6123-b317-4be3-a1af-8a01d43ee60f
Name . . : Leonore Garthland
Gender . : Female
E-Mail . : lgarthlandd8@furl.net
Birth. . : 1991-03-23, Canada
UUID . . : e43ec5ef-3cd2-4d3c-8f3e-106b7c2f2ccf
Name . . : Yank Turfitt
Gender . : Male
E-Mail . : yturfittd9@exblog.jp
Birth. . : 1990-02-07, China
UUID . . : 3e1d6431-62d5-4d4b-8333-a92a66575f9f
Name . . : Benn Pawley
Gender . : Male
E-Mail . : bpawleyda@indiegogo.com
Birth. . : 2006-10-28, Russia
UUID . . : ae60db02-298a-43d3-81a2-59fcf610c045
Name . . : Tod Easen
Gender . : Male
E-Mail . : teasend4@php.net
Birth. . : 1990-08-24, China
ПРИЛОЖЕНИЕ
Я использовал стандартную (ненастроенную) аутентификацию на основе хоста (hba) файл.
pg_hba.conf
# Database administrative login by Unix domain socket
local all postgres peer
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all peer
# IPv4 local connections:
host all all 127.0.0.1/32 md5
# IPv6 local connections:
host all all ::1/128 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
local replication all peer
host replication all 127.0.0.1/32 md5
host replication all ::1/128 md5