2010-04-23 13 views

Respuesta

13

Para conectarse a postgres desde MATLAB sin la caja de herramientas de base de datos hacer algo similar a:

% Add jar file to classpath (ensure it is present in your current dir) 
javaclasspath('postgresql-9.0-801.jdbc4.jar'); 

% Username and password you chose when installing postgres 
props=java.util.Properties; 
props.setProperty('user', '<your_postgres_username>'); 
props.setProperty('password', '<your_postgres_password>'); 

% Create the database connection (port 5432 is the default postgres chooses 
% on installation) 
driver=org.postgresql.Driver; 
url = 'jdbc:postgresql://<yourhost>:<yourport>\<yourdb>'; 
conn=driver.connect(url, props); 

% A test query 
sql='select * from <table>'; % Gets all records 
ps=conn.prepareStatement(sql); 
rs=ps.executeQuery(); 

% Read the results into an array of result structs 
count=0; 
result=struct; 
while rs.next() 
    count=count+1; 
    result(count).var1=char(rs.getString(2)); 
    result(count).var2=char(rs.getString(3)); 
    ... 
end 
+5

Según mi experiencia, la URL debe ser: url = 'jdbc: postgresql: // : /'; (la barra invertida entre '' y '' debe ser una barra diagonal). Esto es mientras ejecuta Matlab y el servidor PostgreSQL en la misma computadora con Windows 7. –

+1

Lo mismo para mí en Linux. La barra invertida no funciona, forwardslash sí. – luator

+0

Se recomienda cerrar el ResultSet una vez que haya terminado de leer los valores. Simplemente agregue rs.close(); para hacerlo –

0

Would MYSQL(additional link) trabajo por usted, al menos como punto de partida?

+0

Lamentablemente, esto no funciona con postgresql. Pero probablemente hay una solución más general a través de ODBC/JDBC? –

7

Como solución general, puede usar JDBC directamente. Todos los Matlabs modernos tienen una JVM incrustada en ellos. Obtenga el archivo JAR del controlador PostScriptql JDBC en su Java CLASSPATH en Matlab y puede construir objetos de conexión y declaración JDBC. Ver "ayuda javaclasspath".

Hay un par de trampas. El registro automático de las clases de controlador JDBC desde los JAR en el classpath dinámico en Matlab parece un tanto peculiar, tal vez porque usa un cargador de clases de URL separado y las clases de JDBC principales están en el cargador de clases del sistema. Por lo tanto, es posible que necesite construir explícitamente instancias de la clase de controlador JDBC y pasarlas a los métodos JDBC, en lugar de usar la construcción implícita del controlador que ve en todos los tutoriales de JDBC. Además, hay una sobrecarga de rendimiento con cada llamada al método Java hecha desde Matlab, que puede volverse costosa si se está pasando por encima del cursor del conjunto de resultados en el código de Matlab. Vale la pena escribir una capa de envoltura delgada en Java que envolverá la interfaz iterativa de JDBC en una interfaz de estilo Matlab orientada a bloques, leyendo los conjuntos de resultados y almacenándolos en matrices en Java, y pasando todas las matrices a Matlab.

usted podría utilizar ODBC, también, pero que requiere la escritura de archivos MEX encadenadas con ODBC o que trabajan con ADO. Más difícil y menos portátil.

EDIT: Usted probablemente puede conseguir las cosas automático del registro de controlador que funcione bien si obtiene los frascos en la ruta de clases de Java estática mediante el uso de un classpath.txt personalizado.

+0

Sí, eso debería funcionar mucho mejor que mi solución. – Jonas

1

que tenían problemas para conectarse a una base de datos pgsql con MATLAB con el modo SSL. El uso de la caja de herramientas de base de datos que debe ser algo como esto: conn = base de datos ('dbname', 'nombre de usuario', 'password', 'org.postgresql.Driver', 'jdbc: postgresql: databaseURL: nombredb: ssl = true & SSLfactory = org.postgresql.ssl.NonValidatingFactory & ')

pero tenían el error: 'FATAL: autenticación de contraseña falló para el usuario 'nombre de usuario''

Así que utilice la secuencia de comandos y obtener el mismo error.

he tenido que añadir la línea

props.setProperty ('SSL', 'verdadero');

y la url normal, no con sslfactory ... como se dice en la ayuda de matlab.

lo que es bueno, pero no puedo utilizar la función de la caja de herramientas de base de datos ... bueno, no es que gran parte de una gran cosa!

Me tomó algún tiempo para averiguar esto, así que tal vez podría ser útil para otros que saben que si ellos también tienen problemas para conectarse a una base de datos a distancia en el modo SSL en.

gracias!

6

Antes que nada, el enlace en la parte superior de la pregunta ya está roto.Hasta donde yo sé, esta antigua biblioteca de pgmex ya no es compatible. Pero existe una biblioteca de cliente PostgreSQL de alto rendimiento completamente nueva PgMex escrita al 100% en C y enlazada con la última versión de PostgreSQL 9.6 libpq.

Como ya se señaló, puede utilizar JDBC directamente, pero en mi humilde opinión es mejor al menos utilizar una de las formas disponibles para acelerar la ejecución de consultas. Por ejemplo, puede aplicar algo como se describe en un interesante artículo "Acelerar consultas SQL de Matlab-JDBC" publicado en el sitio web de Matlab no documentado. La razón principal de un rendimiento degradante del controlador PostgreSQL JDBC está conectada a una sobrecarga significativa de conversión de datos hacia/desde formatos nativos de Matlab (objetos Java a Matlab y viceversa). Pero JDBC en sí tiene ciertas limitaciones que no se pueden solucionar para conjuntos de datos esencialmente grandes. Se puede ver fácilmente, por ejemplo, si tiene que lidiar con matrices. Veamos la siguiente tabla comparando el rendimiento de inserción de datos del método datainsert de Matlab Database Toolbox (trabajando con PostgreSQL, a saber, a través de una conexión JDBC directa, para que pueda ser considerado como un representante relevante de conectores basados ​​en JDBC) con el de batchParamExec desde el mencionado PgMex para el caso de matrices:

 
+-----------+-----------+--------------+------------------+ 
| Number of | Data size | Time for |  Time for  | 
| tuples |   | datainsert | batchParamExec | 
|   |   | (sec.) |  (sec.)  | 
+-----------+-----------+--------------+------------------+ 
| 20000 | 23Mb | 37.0255 |  1.1217  | 
+-----------+-----------+--------------+------------------+ 
| 40000 | 46Mb | 72.4008 |  2.2669  | 
+-----------+-----------+--------------+------------------+ 
| 60000 | 69Mb | 112.4428 |  3.2055  | 
+-----------+-----------+--------------+------------------+ 
| 80000 | 92Mb |  n/a  |  4.2073  | 
+-----------+-----------+--------------+------------------+ 
| 100000 | 115Mb |  n/a  |  5.5277  | 
+-----------+-----------+--------------+------------------+ 
| 300000 | 346Mb |  n/a  |  14.3530  | 
+-----------+-----------+--------------+------------------+ 
| 600000 | 691Mb |  n/a  |  28.3156  | 
+-----------+-----------+--------------+------------------+ 
| 800000 | 922Mb |  n/a  |  38.2579  | 
+-----------+-----------+--------------+------------------+ 
| 1000000 | 1152Mb |  n/a  |  47.8714  | 
+-----------+-----------+--------------+------------------+ 
| 1200000 | 1382Mb |  n/a  |  56.6258  | 
+-----------+-----------+--------------+------------------+ 
| 1400000 | 1613Mb |  n/a  |  65.9764  | 
+-----------+-----------+--------------+------------------+ 
| 1750000 | 2016Mb |  n/a  |  82.1829  | 
+-----------+-----------+--------------+------------------+ 
| 2000000 | 2304Mb |  n/a  |  93.5854  | 
+-----------+-----------+--------------+------------------+ 

Aquí n/a corresponde a los volúmenes de datos que causan “fuera de la memoria de pila Java” problema para el método de inserción dado, Java tamaño de la pila para todos estos experimentos era igual a 939Mb . Para ver los resultados de estos y otros experimentos presentados en forma gráfica, así como para obtener más detalles de los experimentos, consulte el siguiente "Performance comparison of PostgreSQL connectors in Matlab" article).

Por lo tanto, si tiene que tratar con datos que tienen tipos escalares simples y de un volumen no muy grande, JDBC puede satisfacerlo por completo. Pero de lo contrario es mejor en mi humilde opinión utilizar soluciones basadas en libpq como PgMex mencionadas anteriormente. Además de PgMex, existe, por ejemplo, un paquete de fuente abierta mexPostgres (puede encontrarlo en el sitio web de Matlab Central) escrito en C++. Esta biblioteca analiza datos basándose en su representación de texto (a través de la función PQgetvalue de libpq) y solo para una lista muy limitada de tipos de datos (de hecho, son números escalares y lógicos, tiempos, fechas, marcas de tiempo e intervalos, así como cadenas , los tipos más complejos como los arreglos están de nuevo fuera del alcance). Pero la transferencia a través de la representación de texto es muy lenta y puede usarse nuevamente solo para conjuntos de datos no muy grandes. Lo que concierne a PgMex, esta biblioteca implementa un canal de transferencia de datos binarios muy eficiente entre Matlab y PostgreSQL sin ningún tipo de análisis de texto. Además, todo se hace de manera amigable y nativa de Matlab (en forma de matrices, matrices multidimensionales , estructuras y otros formatos arbitrarios de Matlab).

Permítanos dar una pista sobre cómo lidiar con esta última biblioteca basándose en el ejemplo tomado de una de las respuestas anteriores, pero reescrito usando PgMex. A saber, la importación de datos se implementa mediante el siguiente código (suponemos que en el código debajo de los valores de todos los parámetros marcados por <> signos estén llenos, así como que la tabla correspondiente ya existe en la base de datos):

% Create the database connection 
dbConn=com.allied.pgmex.pgmexec('connect',[... 
    'host=<yourhost> dbname=<yourdb> port=<yourport> '... 
    'user=<your_postgres_username> password=<your_postgres_password>']); 

% A test query 
sql='select * from <table>'; % Gets all records 
pgResult=com.allied.pgmex.pgmexec('exec',dbConn,sql); % Perform this test query 

% Read the results 
nFields=com.allied.pgmex.pgmexec('nFields',pgResult); 
outCVec=cell(nFields,1); 
fieldSpecStr='%<field_type_1> %<field_type_2> ...'; 
inpCVec=num2cell(0:nFields-1); 
[outCVec{:}]=com.allied.pgmex.pgmexec('getf',pgResult,... 
    fieldSpecStr,inpCVec{:}); 

Consulte la documentación "getf" en el sitio web de PgMex para obtener detalles sobre el formato de su entrada y los argumentos de salida (incluido fieldSpecStr). Cada elemento de outCVec contiene una estructura que tiene los campos valueVec, isNullVec y isValueNullVec. Todos estos campos tienen un tamaño a lo largo de la primera dimensión que coincide con el número de tuplas recuperadas, valueVec contiene valores del campo de tabla respectivo , mientras que isNullVec y isValueNullVec son indicadores de valores NULL.

+0

cuidado: no libre requiere licencia incluso para uso personal – ItsmeJulian

0

(AVISO: necesidades de caja de herramientas de base de datos)
Aquí es un ejemplo completo de un ready setup postgresql server desde un script de MATLAB, ajustar los parámetros de base de datos en consecuencia:

%Set preferences with setdbprefs. 
setdbprefs('DataReturnFormat', 'cellarray'); 
setdbprefs('NullNumberRead', 'NaN'); 
setdbprefs('NullStringRead', 'null'); 


%Make connection to database. 
%Using JDBC driver. 
conn = database('mydb', 'USERNAME', 'YOURPASSWORD', 'Vendor',... 
    'POSTGRESQL', 'Server', 'SERVERIP', 'PortNumber', 5432); 

%Read data from database, just an example on weather table in mydb database 
curs = exec(conn, ['SELECT weather.city'... 
    ' , weather.temperature'... 
    ' FROM "mydb"."public".weather ']); 

curs = fetch(curs); 
close(curs); 

%Assign data to output variable 
untitled = curs.Data; 

%Close database connection. 
close(conn); 

%Clear variables 
clear curs conn 

Su usuario necesita papel de los derechos de inicio de sesión y ser capaz de acceder a la tablas (GRANT)

Cuestiones relacionadas