用matlab连接到远程postgreSQL数据库

时间:2014-08-30 08:23:33

标签: database matlab postgresql ssl

我的问题是,当我用matlab连接到远程的psql数据库时,我有以下错误:

FATAL: password authentication failed for user "[username]"

但密码是正确的。我已经检查过数据库管理器。

我可以通过PSQL Shell连接到数据库,它可以工作。它只是用matlab。我必须连接SSL,所以我使用以下代码行:

conn = database('dbname','username','password','org.postgresql.Driver',
    'jdbc:postgresql:dm-userdb.geomar.de:users:ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory&');

遵循matlab文档。

数据库管理器认为我在matlab中使用的语法一定是个问题,因为连接与shell一起使用,但是他不熟练使用matlab,所以他无法帮助我。

此外,当我在计算机上创建本地数据库时,我可以使用matlab连接到它。只有在使用matlab的SSL模式下连接到那个远程数据库(在SSL中它也不起作用)。

使用R或python连接到此数据库正在运行。使用R代码是:

install.packages("rpostgres")
library(RPostgreSQL)
drv <- dbDriver("PostgreSQL")
con <- dbConnect(drv, host = "dm-userdb.geomar.de", dbname="users", tty = "NULL", user="****", password = "******", port = "5432")

但是由于我们将使用不同的软件让这个数据库的用户使用,我们必须使它与Matlab一起工作,我不知道我的脚本有什么问题。

我有maverick和matlab R2013a的mac书空气。

如果有人知道出了什么问题,那将会非常好。

2 个答案:

答案 0 :(得分:6)

当然,您可以通过以下答案中显示的方式使用JDBC。但最好是加快查询的执行速度。例如,在Undocumented Matlab网站上有一篇名为“加速Matlab-JDBC SQL查询”的有趣文章。你可以做那样的建议。但是对于大数据或数据类型比标量(如数组)更复杂的情况,IMHO JDBC并不是最好的方法。其中一个原因是将数据转换为原生Matlab格式(从Java对象到Matlab,反之亦然)的开销。所以最好使用基于libpq的解决方案(官方C应用程序程序员的PostgreSQL接口)。例如,您可以尝试使用C ++编写的开源软件包mexPostgres(可以从Matlab Central门户下载)。这个库 基于文本表示(来自libpq的PQgetvalue函数)解析数据,并且只针对非常有限的数据类型列表 (实际上,它们是标量数字和逻辑,时间,日期,时间戳和间隔以及字符串,更复杂的类型,如数组不在范围内)。但是通过文本表示传输是非常慢的,并且可能仅用于非常大的数据集。至少有一个名为PgMex的商业解决方案用C语言编写,也基于libpq。该库在Matlab和PostgreSQL之间实现了非常有效的二进制数据传输通道,无需任何文本解析。此外,所有这些都是以Matlab友好和本地方式完成的(以矩阵的形式, 多维数组,结构和任意其他Matlab格式)。您还可以看到以下内容 "Performance comparison of PostgreSQL connectors in Matlab" article以便更好地理解不允许通过JDBC有效连接Matlab的原因。

通过PgMex从Matlab连接到PostgreSQL非常简单,请参阅以下代码(我们假设下面标有<>标记的所有参数的值都已正确填充):

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

PgMex提供了许多允许导入和导出数据的命令 (仅举几例,请参阅execparamExecbatchParamExec 用于执行查询,getf用于解析查询结果,putf用于将数据放入参数集 可以在参数化查询中使用。)

编辑:现在有PgMex的免费学术许可证。

答案 1 :(得分:1)

我终于找到了一个不使用数据库工具箱的解决方案:

% 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', 'username');
props.setProperty('password', 'password');
props.setProperty('ssl','true');

% Create the database connection
driver=org.postgresql.Driver;
url = 'jdbc:postgresql://databaseURL/dbname';
conn=driver.connect(url, props);

但是我不能使用数据库工具箱的其他功能......

我已经尝试了matlab数据库功能的无数可能性,但它们都没有用过!