postgres/es

From Free Pascal wiki
Jump to navigationJump to search

Deutsch (de) English (en) español (es) français (fr)

Descripción

Se 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#PostgreSQL_package:_the_low_level_units.

Ventajas de PostgreSQL:

  • Su uso está muy difundido y se puede obtener fácilmente.

https://www.postgresql.org/ https://www.openscg.com/bigsql/

  • Muy estable y contiene un conjunto de características muy completo.
  • Licencia liberal (sin coste) en comparación con otras bases de datos.

Desventajas de PostgreSQL:

  • Algunos hosters puede que no ofrezcan PostgreSQL.
  • No existen versiones embebidas.

Win64: por favor mira aquí si existen actualmente advertencias sobre no usar ciertas versiones FPC/Lazarus Win64.

ZEOS

Zeos 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).

Se encuentra disponible para su descarga desde http://sourceforge.net/projects/zeoslib/ , teniendo adicionalmente su foro en http://zeoslib.sourceforge.net/

Más información en ZeosDBO

SQLDB

FPC/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:


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 ...


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.

SQLDB 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.

Se utiliza la propiedad charset para la codificación del cliente.


El componente TPQConnection no soporta directamente la propiedad Port, pero se puede pasar su valor al componente a través del parámetro Params:

PQConnection.Params.Add('port=' + VariableContainingPort);

Mediante la propiedad Params se pueden especificar adicionalmente otros parámetros de la conexión:

PQConnection.Params.Add('application_name=''yourappname''')

Ejemplo

Ver 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.

Monitoreo de eventos

Si tienes FPC2.6.2+ y una versión reciente de Lazarus, entonces puedes utilizar el componente TPQTEventMonitor para monitorizar eventos provenientes de PostgreSQL.

Es un pequeño envoltorio de FPC PQEventMonitor; ver también el programa de ejemplo FPC pqeventstest.pp para más detalles.

Installación y errores

Al 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):

  • a un directorio en la ruta (de búsqueda de librerías) (e.g. c:\windows\system32 para windows)
  • 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)

Por ejemplo, puede que pida algunas librerias extra además de libpg.dll:

intl.dll libeay32.dll libiconv-2.dll libiconv.dll libintl-8.dll libpq.dll libxml2.dll libxslt.dll ssleay32.dll

Es 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.

Driver de 64 bit bajo

Si estás desarrollando aplicaciones de 64 bits entonces debes utilizar las librerías de 64 bit.

Light bulb  Nota: 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).

Resulta bastante difícil de encontrar un driver de 64 bits pero se puede descargar uno desde el siguiente enlace [1].

La 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.

Error: "Can not load PostgreSQL client library "libpq.dll""

Si nos muestra este mensaje de error significa que no puede encontrar los ficheros (drivers)que son necesarios para conectar con PostgreSQL.

Ver las instrucciones de como instalar dichos drivers binarios.

Un buen ejemplo que demuestra como incluir ficheros librería cuando conectamos Lazarus con PostgreSQL (bajo windows) lo podemos encontrar en: easyDB. 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.

En Linux/Unix/OSX es necesario asegurarse de que dichas librerias se encuentren en los trayectos definidos de búsquedas, e.g.:

  • 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
  • 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:
    ln -s /usr/lib/pqsql.so.5 /usr/lib/pqsql.so
    

Alternativamente, 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.

Problemas limpiando parámetros

Light bulb  Nota: Verifica esto: is .paramtype realmente necesario?

Al 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.

En este caso, se debe especificar esplícitamente el tipo, e.g.:

FWriteQuery.Params.ParamByName('LONGITUDE').ParamType:=ptInput; //requerido para PostgreSQL parameter type Inpunt
FWriteQuery.Params.ParamByName('LONGITUDE').Clear

COMO HACER

Uso de INSERT RETURNING

Obtener el último ID insertado

Con PostgreSQL no hay necesidad de realizar una segunda consulta para obtener el último ID insertado.

Uso de INSERT RETURNING y lectura de valor:

var 
  ID: Integer  
..
Query.SQL.Text:= 'INSERT INTO myschema.films(film_name)' +
                 'VALUES(:film_name) RETURNING film_id;';
Query.Open;
ID:= Query.FieldByName('film_id').AsInteger;


El 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,

Obtener multiples campos y expresiones

RETURNING 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.


INSERT INTO films (film_name) VALUE 'val' RETURNING film_id;  -- Retorna id's para las nuevas filas creadas.
INSERT INTO films (film_name) VALUE 'val' RETURNING film_id, kind;  -- Retorna los campos film_id y kind de las nuevas filas creadas.
INSERT INTO films (film_name) VALUE 'val' RETURNING *; -- Retorna todos los campos de las filas nuevas creadas.
     
UPDATE films SET kind = 'Dramatic' WHERE kind = 'Drama' RETURNING film_id; -- Retorna id´s de las filas actualizadas.
UPDATE films SET kind = 'Dramatic' WHERE kind = 'Drama' RETURNING film_id, film_name; -- Retorna id y film_name de las filas actualizadas.
UPDATE films SET kind = 'Dramatic' WHERE kind = 'Drama' RETURNING *; -- Retorna todos los campos de las filas actualizadas.
     
DELETE FROM films RETURNING film_id; --Retorna los id's de las filas eliminadas.
DELETE FROM films RETURNING film_id, film_name; --Retorna id's y nombres de películas de las filas eliminadas.
DELETE FROM films RETURNING *;  -- Retorna todos los campos de las filas eliminadas.

RETURNING utilizando campos, constante y expresiones:

INSERT 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;

.

Paquete PostgreSQL package: las unidades de bajo nivel

Al 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.

Su 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.

La unidad principal se llama postgres, normalmente es la única unidad que debes incluir en la claúsula uses.

Requerimientos

Se 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.

Instalación

La 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:

  • El directorio donde reside la librería libpq que habitualmente se encuentra en /usr/local/pgsql/lib

Lo que se debe teclear

En primer lugar el mandato make que compilará las units y el programa:

make

Si la compilación se realiza con éxito, entonces podemos instalar el programa con el mandato:

make install

(Recordar establecer el valor correcto del directorio donde las units deben ser instaladas)

A continuación es interesante realizar un test del programa con el mandato:

make test

Esto realizará lo siguiente:

  • Ejecutar el programa de test testpg, el cual se ha portado del programa de ejemplo de la guía de programadores de PostGreSQL.
  • 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.
  • Ejecutar el programa de testeo testemail.
  • Ejecutar el script en el shell de nuevo para eliminar la tabla creada una vez que tenemos verificado el funcionamiento.

Con 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.

Planes futuros:

El 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.

Ver además

  • TPSQL - Un conjunto diferente de componentes dataset/database de PostgreSQL.
  • Lazarus DB Faq - Más acerca de programación de bases de datos.
  • Lazarus Database Tutorial - Haciendo que Lazarus funcione con varias bases de datos.



Return To: LCL Components  — Previous: TSybaseConnection Next: TPQTEventMonitor


LCL Components
Component Tab Components
Standard TMainMenu • TPopupMenu • TButton • TLabel • TEdit • TMemo • TToggleBox • TCheckBox • TRadioButton • TListBox • TComboBox • TScrollBar • TGroupBox • TRadioGroup • TCheckGroup • TPanel • TFrame • TActionList
Additional TBitBtn • TSpeedButton • TStaticText • TImage • TShape • TBevel • TPaintBox • TNotebook • TLabeledEdit • TSplitter • TTrayIcon • TControlBar • TFlowPanel • TMaskEdit • TCheckListBox • TScrollBox • TApplicationProperties • TStringGrid • TDrawGrid • TPairSplitter • TColorBox • TColorListBox • TValueListEditor
Common Controls TTrackBar • TProgressBar • TTreeView • TListView • TStatusBar • TToolBar • TCoolBar • TUpDown • TPageControl • TTabControl • THeaderControl • TImageList • TPopupNotifier • TDateTimePicker
Dialogs TOpenDialog • TSaveDialog • TSelectDirectoryDialog • TColorDialog • TFontDialog • TFindDialog • TReplaceDialog • TTaskDialog • TOpenPictureDialog • TSavePictureDialog • TCalendarDialog • TCalculatorDialog • TPrinterSetupDialog • TPrintDialog • TPageSetupDialog
Data Controls TDBNavigator • TDBText • TDBEdit • TDBMemo • TDBImage • TDBListBox • TDBLookupListBox • TDBComboBox • TDBLookupComboBox • TDBCheckBox • TDBRadioGroup • TDBCalendar • TDBGroupBox • TDBGrid • TDBDateTimePicker
Data Access TDataSource • TCSVDataSet • TSdfDataSet • TBufDataset • TFixedFormatDataSet • TDbf • TMemDataset
System TTimer • TIdleTimer • TLazComponentQueue • THTMLHelpDatabase • THTMLBrowserHelpViewer • TAsyncProcess • TProcessUTF8 • TProcess • TSimpleIPCClient • TSimpleIPCServer • TXMLConfig • TEventLog • TServiceManager • TCHMHelpDatabase • TLHelpConnector
Misc TColorButton • TSpinEdit • TFloatSpinEdit • TArrow • TCalendar • TEditButton • TFileNameEdit • TDirectoryEdit • TDateEdit • TTimeEdit • TCalcEdit • TFileListBox • TFilterComboBox • TComboBoxEx • TCheckComboBox • TButtonPanel • TShellTreeView • TShellListView • TXMLPropStorage • TINIPropStorage • TJSONPropStorage • TIDEDialogLayoutStorage • TMRUManager • TStrHolder
LazControls TCheckBoxThemed • TDividerBevel • TExtendedNotebook • TListFilterEdit • TListViewFilterEdit • TLvlGraphControl • TShortPathEdit • TSpinEditEx • TFloatSpinEditEx • TTreeFilterEdit • TExtendedTabControl •
RTTI TTIEdit • TTIComboBox • TTIButton • TTICheckBox • TTILabel • TTIGroupBox • TTIRadioGroup • TTICheckGroup • TTICheckListBox • TTIListBox • TTIMemo • TTICalendar • TTIImage • TTIFloatSpinEdit • TTISpinEdit • TTITrackBar • TTIProgressBar • TTIMaskEdit • TTIColorButton • TMultiPropertyLink • TTIPropertyGrid • TTIGrid
SQLdb TSQLQuery • TSQLTransaction • TSQLScript • TSQLConnector • TMSSQLConnection • TSybaseConnection • TPQConnection • TPQTEventMonitor • TOracleConnection • TODBCConnection • TMySQL40Connection • TMySQL41Connection • TMySQL50Connection • TMySQL51Connection • TMySQL55Connection • TMySQL56Connection • TMySQL57Connection • TSQLite3Connection • TIBConnection • TFBAdmin • TFBEventMonitor • TSQLDBLibraryLoader
Pascal Script TPSScript • TPSScriptDebugger • TPSDllPlugin • TPSImport_Classes • TPSImport_DateUtils • TPSImport_ComObj • TPSImport_DB • TPSImport_Forms • TPSImport_Controls • TPSImport_StdCtrls • TPSCustomPlugin
SynEdit TSynEdit • TSynCompletion • TSynAutoComplete • TSynMacroRecorder • TSynExporterHTML • TSynPluginSyncroEdit • TSynPasSyn • TSynFreePascalSyn • TSynCppSyn • TSynJavaSyn • TSynPerlSyn • TSynHTMLSyn • TSynXMLSyn • TSynLFMSyn • TSynDiffSyn • TSynUNIXShellScriptSyn • TSynCssSyn • TSynPHPSyn • TSynTeXSyn • TSynSQLSyn • TSynPythonSyn • TSynVBSyn • TSynAnySyn • TSynMultiSyn • TSynBatSyn • TSynIniSyn • TSynPoSyn
Chart TChart • TListChartSource • TRandomChartSource • TUserDefinedChartSource • TCalculatedChartSource • TDbChartSource • TChartToolset • TChartAxisTransformations • TChartStyles • TChartLegendPanel • TChartNavScrollBar • TChartNavPanel • TIntervalChartSource • TDateTimeIntervalChartSource • TChartListBox • TChartExtentLink • TChartImageList
IPro TIpFileDataProvider • TIpHtmlDataProvider • TIpHttpDataProvider • TIpHtmlPanel
Virtual Controls TVirtualDrawTree • TVirtualStringTree • TVTHeaderPopupMenu


Volver a Packages List