I am trying to query a PostgreSQL database using GNAT CE 2019. I have two tables in my database, car and person:
mydb1-# \dt
List of relations
Schema | Name | Type | Owner
--------+--------+-------+----------
public | car | table | postgres
public | person | table | postgres
(2 rows)
I would like to perfom a simple Select statement, when I perform this using psql in my terminal, this is what's returned:
mydb1=# SELECT * FROM Person;
person_uid | first_name | last_name | gender | email | date_of_birth | country_of_birth | car_uid
--------------------------------------+------------+------------+--------+------------------------------+---------------+------------------+--------------------------------------
75f5e55d-12b2-463e-93ff-1c921e44c3e1 | Audrie | Vasyukov | Female | [email protected] | 1988-11-24 | Guatemala |
9e3f7f90-6e9a-4f2d-ae4e-c852d819ed33 | Nefen | Philippard | Male | [email protected] | 2006-11-08 | Russia |
ffad6113-2321-47c3-8e1d-b8bbe1f7ffa1 | Leonore | Garthland | Female | [email protected] | 1991-03-23 | Canada |
268c1977-a5cc-4794-9cdd-e0e4af7890b9 | Yank | Turfitt | Male | [email protected] | 1990-02-07 | China |
3c815fa3-74b9-493a-9466-f32010806b16 | Benn | Pawley | Male | [email protected] | 2006-10-28 | Russia |
690fc9e9-309e-4d70-8dab-167653b99763 | Tod | Easen | Male | [email protected] | 1990-08-24 | China | 5fa7490e-ba42-4a96-b806-097bbb16e30e
However, I would like to perform this from within GNAT CE 2019. This is how my main.adb file currently looks:
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;
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
-- Database Description
--
DB_Descr := GNATCOLL.SQL.Postgres.Setup ("mydb1", "parallels", "localhost", "MyPassword", 5432);
-- Database Connection
--
DB := DB_Descr.Build_Connection;
-- Query the data
--
Q := SQL_Select
(Fields => Person.first_name,
From => Person);
Free (DB); -- for all connections you have opened
Free (DB_Descr);
end Main;
When attempting to make a connection to the database, the process terminates successfully.
I'm unsure of the syntax that should be used for the Select statement. If anyone would be able to tell me how to perform a simple SELECT * FROM Person;
statement from within GNAT CE 2019, it would be greatly appreciated.
Thank you, Lloyd
Added 13/05/20
parallels@localhost gnatcoll_db2ada]$ ls
dborm.py gnatcoll-db2ada-main-generate.adb
dbschema.txt gnatcoll_postgres2ada.adb
gnatcoll_all2ada.adb gnatcoll_postgres2ada.gpr
gnatcoll_all2ada.gpr gnatcoll_sqlite2ada.adb
gnatcoll_db2ada.adb gnatcoll_sqlite2ada.gpr
gnatcoll-db2ada.ads Makefile
gnatcoll_db2ada.gpr makefile.setup
[parallels@localhost gnatcoll_db2ada]$ gnatcoll_postgres2ada -dbmodel dschema.txt/home/parallels/Desktop/dschema.txt
bash: gnatcoll_postgres2ada: command not found...
[parallels@localhost gnatcoll_db2ada]$
Added 15/05/20
prbuild -d -P/home/parallels/Documents/Ada Projects/TEST/default.gpr -XGNATCOLL_OS=unix -XBUILD=PROD -XGNATCOLL_HASPQPREPARE=yes -XGPR_BUILD=static -XLIBRARY_TYPE=static -XXMLADA_BUILD=static -XGNATCOLL_CORE_BUILD=static -XGNATCOLL_BUILD=static /home/parallels/Documents/Ada Projects/TEST/src/main.adb
Compile
[Ada] main.adb
Bind
[gprbind] main.bexch
[Ada] main.ali
Link
[link] main.adb
/home/parallels/opt/GNAT/2019/bin/../libexec/gcc/x86_64-pc-linux-gnu/8.3.1/ld: cannot find -lpq
collect2: error: ld returned 1 exit status
gprbuild: link of main.adb failed
gprbuild: failed command was: /home/parallels/opt/GNAT/2019/bin/gcc main.o b__main.o /home/parallels/Documents/Ada Projects/TEST/obj/database_names.o /home/parallels/Documents/Ada Projects/TEST/obj/database.o /home/parallels/gnatcoll-db/postgres/lib/static/libgnatcoll_postgres.a /home/parallels/gnatcoll-db/sql/lib/static/libgnatcoll_sql.a /home/parallels/opt/GNAT/2019/lib/gnatcoll.static/libgnatcoll.a /home/parallels/opt/GNAT/2019/lib/gpr/static/gpr/libgpr.a /home/parallels/opt/GNAT/2019/lib/xmla
da/xmlada_schema.static/libxmlada_schema.a /home/parallels/opt/GNAT/2019/lib/xmlada/xmlada_dom.static/libxmlada_dom.a /home/parallels/opt/GNAT/2019/lib/xmlada/xmlada_sax.static/libxmlada_sax.a /home/parallels/opt/GNAT/2019/lib/xmlada/xmlada_input.static/libxmlada_input_sources.a /home/parallels/opt/GNAT/2019/lib/xmlada/xmlada_unicode.static/libxmlada_unicode.a -lpq -L/home/parallels/Documents/Ada Projects/TEST/obj/ -L/home/parallels/Documents/Ada Projects/TEST/obj/ -L/home/parallels/gnatcoll-db/p
ostgres/lib/static/ -L/home/parallels/opt/GNAT/2019/lib/gnatcoll.static/ -L/home/parallels/opt/GNAT/2019/lib/xmlada/xmlada_dom.static/ -L/home/parallels/opt/GNAT/2019/lib/xmlada/xmlada_sax.static/ -L/home/parallels/opt/GNAT/2019/lib/xmlada/xmlada_unicode.static/ -L/home/parallels/opt/GNAT/2019/lib/xmlada/xmlada_input.static/ -L/home/parallels/opt/GNAT/2019/lib/xmlada/xmlada_schema.static/ -L/home/parallels/opt/GNAT/2019/lib/gpr/static/gpr/ -L/home/parallels/gnatcoll-db/sql/lib/static/ -L/home/par
allels/opt/GNAT/2019/lib/gcc/x86_64-pc-linux-gnu/8.3.1/adalib/ -static-libgcc /home/parallels/opt/GNAT/2019/lib/gcc/x86_64-pc-linux-gnu/8.3.1/adalib/libgnarl.a /home/parallels/opt/GNAT/2019/lib/gcc/x86_64-pc-linux-gnu/8.3.1/adalib/libgnat.a -lrt -lpthread -ldl -Wl,-rpath-link,/home/parallels/opt/GNAT/2019/lib/gcc/x86_64-pc-linux-gnu/8.3.1//adalib -Wl,-z,origin,-rpath,$ORIGIN/:$ORIGIN/../../../..//gnatcoll-db/postgres/lib/static:$ORIGIN/../../../..//opt/GNAT/2019/lib/gnatcoll.static:$ORIGIN/../../
../..//opt/GNAT/2019/lib/xmlada/xmlada_dom.static:$ORIGIN/../../../..//opt/GNAT/2019/lib/xmlada/xmlada_sax.static:$ORIGIN/../../../..//opt/GNAT/2019/lib/xmlada/xmlada_unicode.static:$ORIGIN/../../../..//opt/GNAT/2019/lib/xmlada/xmlada_input.static:$ORIGIN/../../../..//opt/GNAT/2019/lib/xmlada/xmlada_schema.static:$ORIGIN/../../../..//opt/GNAT/2019/lib/gpr/static/gpr:$ORIGIN/../../../..//gnatcoll-db/sql/lib/static:$ORIGIN/../../../..//opt/GNAT/2019/lib/gcc/x86_64-pc-linux-gnu/8.3.1/adalib -o main
[2020-05-15 14:56:50] process exited with status 4, 100% (30/30), elapsed time: 02.34s
Added 17/05/20
[SQL.ERROR] FATAL: Ident authentication failed for user "postgres"
_SQL.ERROR_ FATAL: Ident authentication failed for user "postgres"
_SQL.ERROR_ params="dbname='mydb1' user='postgres' host='localhost' sslmode=allow" ()
[SQL.ERROR] Failed to execute SELECT persons.person_uid, persons.first_name, persons.last_name, persons.gender, persons.email, persons.date_of_birth, persons.country_of_birth FROM persons error=No connection to database
FAILED
[2020-05-17 19:30:04] process terminated successfully, elapsed time: 00.19s
Added 29/05/20
home/parallels/Documents/Ada Projects/Connect to a DB/obj/main
[SQL.ERROR] select failed: SELECT persons.person_uid, persons.first_name, persons.last_name, persons.gender, persons.email, persons.date_of_birth, persons.country_of_birth FROM persons PGRES_FATAL_ERROR ERROR: relation "persons" does not exist
_SQL.ERROR_ LINE 1: ...persons.date_of_birth, persons.country_of_birth FROM persons
_SQL.ERROR_ ^
FAILED
[2020-05-29 22:40:11] process terminated successfully, elapsed time: 00.19s
postgres=# select * from persons;
person_uid | first_name | last_name | gender | email | date_of_birth | country_of_birth
--------------------------------------+------------+------------+--------+------------------------------+---------------+------------------
afbf64be-e7d5-45a1-b8fb-1a9fd66e2765 | Audrie | Vasyukov | Female | [email protected] | 1988-11-24 | Guatemala
ffda7264-1e54-428b-ae68-9ddb7b97702a | Nefen | Philippard | Male | [email protected] | 2006-11-08 | Russia
169d5fb9-8d40-451e-8b02-cd1c3639fbed | Leonore | Garthland | Female | [email protected] | 1991-03-23 | Canada
e34f4f21-524c-4134-81d6-7fd1fd9a7537 | Yank | Turfitt | Male | [email protected] | 1990-02-07 | China
57336d0e-34f2-4166-a100-7b468e96a521 | Benn | Pawley | Male | [email protected] | 2006-10-28 | Russia
b54a8411-3674-4432-b896-aaf35a10919b | Tod | Easen | Male | [email protected] | 1990-08-24 | China
(6 rows)
The user manual states that you must first generate Ada data types that represent the entities (tables, fields, etc.) of the database with which you interact in order to use functions like
SQL_Select
. This can be done using thegnatcoll_db2ada
utility (see here); either by some sort of reflection on the database or by providing a hand written schema (example in the user manual). Here are my own steps for creating an example.Install dependencies:
Create a database user (here:
deedee
):Clone
gnatcoll-db
:Build and install
gnatcoll-sql
:Build and install
gnatcoll-postgress
:Build and install
gnatcoll_db2ada
:The utility will be installed next to all other GNAT programs:
To use the utility, I first created a small database using the data you provided. I recreated the table
persons
using the commands:with
persons.sql
I then created a database schema (see user manual) and generated the Ada code:
with
dschema.txt
I finally added a trace configuration file (based on the example in the GNATcoll user manual), adapted your example code and made it work with my own table:
.gnatdebug (write trace info to standard error; indicated by
>&2
)default.gpr
main.adb
build & output
APPENDIX
I used the default (non-customized) host-based authentication (hba) file.
pg_hba.conf