Sign in Join
Wiki copytemporary

postgres/es: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11## Descripción
22
33Se puede utilizar FreePascal/Lazarus para acceder a un servidor de bases de datos (BB.DD). Si estás buscando más información sobre el paquete postgres en FPC,por favor visita el siguiente sitio [[postgres|postgres#PostgreSQL_package:_the_low_level_units]].
44
55Ventajas de PostgreSQL:
66
77- Su uso está muy difundido y se puede obtener fácilmente.
88
99<https://www.postgresql.org/> <https://www.openscg.com/bigsql/>
1010
1111- Muy estable y contiene un conjunto de características muy completo.
1212- Licencia liberal (sin coste) en comparación con otras bases de datos.
1313
1414Desventajas de PostgreSQL:
1515
1616- Algunos hosters puede que no ofrezcan PostgreSQL.
1717- No existen versiones embebidas.
1818
1919Win64: por favor mira [[Windows Programming Tips|aquí]] si existen actualmente advertencias sobre no usar ciertas versiones FPC/Lazarus Win64.
2020
2121ZEOS
2222
2323Zeos soporta PostgreSQL y lo podemos utilizar con FreePascal y con Lazarus. Con Lazarus lo podemos añadir como paquete de forma que lo tengamos disponible en una nueva solapa del IDE. (adicionalmente puede que haya que instalar alguna versión de C++ portable dependiendo de con cual se haya compilado Zeos).
2424
2525Se encuentra disponible para su descarga desde <http://sourceforge.net/projects/zeoslib/> , teniendo adicionalmente su foro en <http://zeoslib.sourceforge.net/>
2626
2727Más información en [[ZeosDBO]]
2828
2929## SQLDB
3030
3131FPC/Lazarus soporta PostgreSQL de base con un componente/clase de conexión PostgreSQL. Si solamnete estás utilizando FPC o necestias añadir soporte para PostgreSQL, añade *pqconnection* a tu claúsula *uses*. En cualquer caso, Lazarus aporta un componente:
3232
3333[center|framed|200px|Solapa SQLDB en el IDE de Lazarus con los componentes de conexión a diferentes BB.DD, consulta, transacción, script, conector, cargador de librería ...](/wiki-images/c/c5/Sqldbcomponents.png%E2%80%8E)
3434
3535**Nota:** El cliente libpq (escrito en lenguaje C) contiene alguna pérdida de memoria (al menos hasta la versión version 9.3 de Postgres, que a fecha de realizar esta traducción va por la 9.4.1) cuando la librería es cargada/descargada reiteradamente.
3636
3737SQLDB carga la librería cuando se realiza la primera conexión, y la descarga cuando se cierra la última conexión. Esto significa que cada vez que la conexión se cierra, se produce una pequeña pérdida de memoria. Para prevenir que esto suceda (y acelerar el funcionamiento de la aplicación) puedes cargar la librería una vez al comienzo del proceso con la llamada InitialisePostgres3.
3838
3939Se utiliza la propiedad charset para la codificación del cliente.
4040
4141El componente TPQConnection no soporta directamente la propiedad **Port**, pero se puede pasar su valor al componente a través del parámetro **Params**:
4242
4343``` pascal
4444PQConnection.Params.Add('port=' + VariableContainingPort);
4545```
4646
4747Mediante la propiedad **Params** se pueden especificar adicionalmente otros parámetros de la conexión:
4848
4949``` pascal
5050PQConnection.Params.Add('application_name=''yourappname''')
5151```
5252
5353### Ejemplo
5454
5555Ver [[SQLdb Tutorial1]] para acceder a un tutorial sobre como crear un programa con interface gráfico de usuario con conexión a bases de datos escrito para PostgreSQL/SQLDB, al igual que para SQLite/SQLDB, Firebird/SQLDB, y básicamente que soporte RDBMS SQLDB.
5656
5757### Monitoreo de eventos
5858
5959Si tienes FPC2.6.2+ y una versión reciente de Lazarus, entonces puedes utilizar el componente **TPQTEventMonitor** para monitorizar eventos provenientes de PostgreSQL.
6060
6161Es un pequeño envoltorio de FPC **PQEventMonitor**; ver también el programa de ejemplo FPC pqeventstest.pp para más detalles.
6262
6363### Installación y errores
6464
6565Al igual que con todas las unidades sqldb, necesitas añadir una(s) librería(s) drivers (**todas** las librerias PostgreSQL .dll/ y ficheros de manifiesto .manifest):
6666
6767- a un directorio en la ruta (de búsqueda de librerías) (e.g. c:\windows\system32 para windows)
6868- o (en Windows) al directorio de salida del programa (e.g. lib/algo/ donde algo es el directorio donde se encuentra el programa/proyecto que estemos desarrollando)
6969
7070Por ejemplo, puede que pida algunas librerias extra además de libpg.dll:
7171
7272intl.dll libeay32.dll libiconv-2.dll libiconv.dll libintl-8.dll libpq.dll libxml2.dll libxslt.dll ssleay32.dll
7373
7474Es conveniente que obtengamos estas liberias de versión acorde con la de la versión del servidor a que nos conectemos, y en el caso de las que conllevan la seguridad posiblemente actualizadas de algún sitio de confianza o bien descargar sus fuentes y compilarlas.
7575
7676#### Driver de 64 bit bajo
7777
7878Si estás desarrollando aplicaciones de 64 bits entonces debes utilizar las librerías de 64 bit.
7979
8080> **Note:** FPC 2.6.0 (por lo tanto Lazarus 1.0.4 o inferior) no soporta todavíad PostgreSQL bajo Windows 64 bit (a menos que se parchee y recompile).
8181
8282Resulta bastante difícil de encontrar un driver de 64 bits pero se puede descargar uno desde el siguiente enlace [1](http://www.enterprisedb.com/products-services-training/pgdownload#windows).
8383
8484La librería de driver se puede instalar en c:\windows\system32; las librerías de driver de 32 bit también se pueden instalar en c:\windows\syswow64 cuando tenemos un sistema operativo de 64 bits.
8585
8686#### Error: "Can not load PostgreSQL client library "libpq.dll""
8787
8888Si nos muestra este mensaje de error significa que no puede encontrar los ficheros (drivers)que son necesarios para conectar con PostgreSQL.
8989
9090Ver las instrucciones de como instalar dichos drivers binarios.
9191
9292Un buen ejemplo que demuestra como incluir ficheros librería cuando conectamos Lazarus con PostgreSQL (bajo windows) lo podemos encontrar en: [easyDB](http://paginas.fe.up.pt/~asousa/wiki/doku.php?id=proj:lazarus_projects#easy_db). Tener en cuenta que hay parámetros que es necesario cambiar de forma que se adapte a nuestra conexión local, como usuario, contraseña, si es una conexión local o en red. También que algún parámetro se toma a través de un fichero de configuración de Lazarus, que no viene definido en el código.
9393
9494En Linux/Unix/OSX es necesario asegurarse de que dichas librerias se encuentren en los trayectos definidos de búsquedas, e.g.:
9595
9696- En Linux añade el trayecto hacia el fichero libpq.so dentro de la sección de librerias /etc/fpc.cfg . Por ejemplo: -Fl/usr/local/pgsql/lib
9797- Puede que sea necesario crear un enlace simbólico hacia una una librería con una versión específica de forma que sea llamada cuando el programa llame a una librería de nombre genérico:
9898 ``` bash
9999 ln -s /usr/lib/pqsql.so.5 /usr/lib/pqsql.so
100100 ```
101101
102102Alternativamente, instala el paquete de cliente de PostgreSQL (pero la versión de desarrollo que acaba en **-dev** utilizando el gestor de paquetes de la distribución que utilices. El enlace simbólico es algo que se utiliza mucho para referenciar el nombre genérico frente a las posibles nuevas versiones que podemos por ejemplo descargar al margen de las disponibles en los repositorios oficiales de cada distro.
103103
104104#### Problemas limpiando parámetros
105105
106106> **Note:** Verifica esto: is .paramtype realmente necesario?
107107
108108Al menos en FPC \<= 2.6.2: si tu limpias (.Clear) un parámetro (i.e. estableciendolo a NULL), PostgreSQL puede tener dificultades reconociendo el tipo de parámetro.
109109
110110En este caso, se debe especificar esplícitamente el tipo, e.g.:
111111
112112``` pascal
113113FWriteQuery.Params.ParamByName('LONGITUDE').ParamType:=ptInput; //requerido para PostgreSQL parameter type Inpunt
114114FWriteQuery.Params.ParamByName('LONGITUDE').Clear
115115```
116116
117117## COMO HACER
118118
119119### Uso de INSERT RETURNING
120120
121121#### Obtener el último ID insertado
122122
123123Con PostgreSQL no hay necesidad de realizar una segunda consulta para obtener el último ID insertado.
124124
125125Uso de INSERT RETURNING y lectura de valor:
126126
127127``` pascal
128128var
129129 ID: Integer
130130..
131131Query.SQL.Text:= 'INSERT INTO myschema.films(film_name)' +
132132 'VALUES(:film_name) RETURNING film_id;';
133133Query.Open;
134134ID:= Query.FieldByName('film_id').AsInteger;
135135```
136136
137137El valor retornado **film_id** por la consulta SQL lo asignamos a ID (que ya definimos como una variable tipo Integer) y por ello también indicamos el tipo de valor en **.AsInteger**,
138138
139139#### Obtener multiples campos y expresiones
140140
141141RETURNING en PostgreSQL es más flexible que en la mayoría de los motores de bases de datos. Funciona con sentencias INSERT, UPDATE y DELETE y puede tener cualquier listado de campos, constantes o expresiones que podamos encontrar en un listado de SELECT.
142142
143143``` SQL
144144INSERT INTO films (film_name) VALUE 'val' RETURNING film_id; -- Retorna id's para las nuevas filas creadas.
145145INSERT INTO films (film_name) VALUE 'val' RETURNING film_id, kind; -- Retorna los campos film_id y kind de las nuevas filas creadas.
146146INSERT INTO films (film_name) VALUE 'val' RETURNING *; -- Retorna todos los campos de las filas nuevas creadas.
147147
148148UPDATE films SET kind = 'Dramatic' WHERE kind = 'Drama' RETURNING film_id; -- Retorna id´s de las filas actualizadas.
149149UPDATE films SET kind = 'Dramatic' WHERE kind = 'Drama' RETURNING film_id, film_name; -- Retorna id y film_name de las filas actualizadas.
150150UPDATE films SET kind = 'Dramatic' WHERE kind = 'Drama' RETURNING *; -- Retorna todos los campos de las filas actualizadas.
151151
152152DELETE FROM films RETURNING film_id; --Retorna los id's de las filas eliminadas.
153153DELETE FROM films RETURNING film_id, film_name; --Retorna id's y nombres de películas de las filas eliminadas.
154154DELETE FROM films RETURNING *; -- Retorna todos los campos de las filas eliminadas.
155155```
156156
157157RETURNING utilizando campos, constante y expresiones:
158158
159159``` SQL
160160INSERT INTO films (filmname) VALUE 'val' RETURNING id, 'a' AS a, id*2 AS doubled_id, CASE WHEN id > 100 THEN 'a' ELSE 'b' END AS foo;
161161```
162162
163163.
164164
165165## Paquete PostgreSQL package: las unidades de bajo nivel
166166
167167Al igual que con el resto de bases de datos, el código SQLDB depende de una unidad PostgreSQL de bajo nivel que encapsula sobre la librería del driver de PostgreSQL (.so/.dll/.dylib). Normalmente, deberías utilizar el código de alto nivel de SQLDB ya que permite permite codificar más rápida y facilmente, cambiar de bases de datos facilmente, etc.
168168
169169Su uso es bastante fácil, todo lo que necesitas es compilar algunas unidades y utilizarlas en tu programa. Necesitas especificar, eso si, el lugar en que se encuentra la librería cliente de PostgreSQL (libpq) para compilarlo y ya está, eso es todo.
170170
171171La unidad principal se llama **postgres**, normalmente es la única unidad que debes incluir en la claúsula **uses**.
172172
173173## Requerimientos
174174
175175Se necesita al menos la versión 0.99.5 de FreePascal. Las cabeceras (headers) han sido portadas de la versión 6.3.1 de PostGreSQL. El uso de una versión anterior probablemente no funcione.
176176
177177### Instalación
178178
179179La unit postgres viene con los paquetes de FreePascal, y se distribuye junto con el compilador. Este contiene un directorio postgres con las units, un programa de test y un fichero make (makefile). En dicho directorio se puede editar el fichero makefile para establecer las variables que contiene adaptándolas al sistema que estemos utilizando. A priori solo debes adaptar una cosa:
180180
181181- El directorio donde reside la librería libpq que habitualmente se encuentra en /usr/local/pgsql/lib
182182
183183## Lo que se debe teclear
184184
185185En primer lugar el mandato make que compilará las units y el programa:
186186
187-**`make`**
187+```text
188+make
189+```
188190
189191Si la compilación se realiza con éxito, entonces podemos instalar el programa con el mandato:
190192
191-**`make install`**
193+```text
194+make install
195+```
192196
193197(Recordar establecer el valor correcto del directorio donde las units deben ser instaladas)
194198
195199A continuación es interesante realizar un test del programa con el mandato:
196200
197-**`make test`**
201+```text
202+make test
203+```
198204
199205Esto realizará lo siguiente:
200206
201207- Ejecutar el programa de test **testpg**, el cual se ha portado del programa de ejemplo de la guía de programadores de PostGreSQL.
202208
203209- Ejecutar un script para crear una tabla dentro de la base de datos y rellenarla con datos. (el programa psql debería encontrarse en el PATH para que todo funcione bien). La base de datos que se utiliza por defecto es testdb.
204210
205211- Ejecutar el programa de testeo **testemail**.
206212
207213- Ejecutar el script en el shell de nuevo para eliminar la tabla creada una vez que tenemos verificado el funcionamiento.
208214
209215Con todo esto obtenemos un montón de mensajes en pantalla que nos aportarán mucha información y resultados. En caso de que algo vaya mal, el mandato make nos informará convenientemente.
210216
211217Planes futuros:
212218
213219El interface de PostGreSQL es una pura traducción de los ficheros de cabecera en C que tiene PostGreSQL. Esto significa que las funciones utilizadas están poco pascalizadas. Sería interesante tener un interface OOP al estilo de Delphi por lo que ya se está trabajando en ello.
214220
215221## Ver además
216222
217223- [[TPSQL]] - Un conjunto diferente de componentes dataset/database de PostgreSQL.
218224- [[Lazarus DB Faq]] - Más acerca de programación de bases de datos.
219225- [[Lazarus Database Tutorial]] - Haciendo que Lazarus funcione con varias bases de datos.
220226
221227Volver a [[Package List|Packages List]]
222228
223229---
224230*From the Free Pascal wiki, page "postgres/es", as it stood on 2020-02-23 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
225231Category: Castellano
226232Category: Español

Back to history