如何在没有Matlab数据库工具箱的情况下从Matlab访问PostgreSQL数据库?

6

我已经尝试使用pgmex。不幸的是,它无法与libpq5配合使用(matlab立即崩溃)。

5个回答

16

如果不使用数据库工具箱,可以通过类似以下方式从 Matlab 连接到 Postgres:

% 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

6
根据我的经验,URL 应该是:url = 'jdbc:postgresql://<yourhost>:<yourport>/<yourdb>';(在 Matlab 和 PostgreSQL 服务器运行在同一台 Windows 7 计算机上时,“<yourport>”和“<yourdb>”之间的反斜杠应该改为正斜杠)。 - user842739
1
我在Linux上也一样。反斜杠不起作用,正斜杠可以。 - luator
建议在读取完值后关闭ResultSet。只需添加rs.close();即可实现。 - Mouse On Mars

6
作为一种通用的解决方案,您可以直接使用JDBC。现代Matlab都嵌入了JVM。在Matlab中将Postgresql JDBC驱动程序JAR文件放置在Java CLASSPATH上,即可构建JDBC连接和语句对象。请参见“help javaclasspath”。
还有一些需要注意的地方。在Matlab的动态类路径上自动注册JAR中的JDBC驱动程序类似乎有点古怪,可能是因为它使用单独的URL类加载器,而核心JDBC类在系统类加载器中。因此,您可能需要显式地构造JDBC驱动程序类的实例并将它们传递给JDBC方法,而不是使用所有JDBC教程中看到的隐式驱动程序构造。此外,每次从Matlab代码中进行的Java方法调用都会有性能开销,如果您正在循环遍历Matlab代码中的结果集光标,则可能变得非常昂贵。值得编写一个薄包装层,在Java中将JDBC的迭代接口包装成块式的Matlab风格接口,读取结果集并在Java中将其缓冲在数组中,并将整个数组传递回Matlab。
您也可以使用ODBC,但这需要编写链接到ODBC的MEX文件或使用ADO。更难以处理且不太便携。
编辑:如果您通过使用自定义classpath.txt将JAR放置在静态Java类路径上,则可以正确地获取自动驱动程序注册的内容。

1
我在使用Matlab连接带SSL模式的pgsql数据库时遇到了问题。使用数据库工具箱应该像这样: conn = database('dbname','username','password','org.postgresql.Driver','jdbc:postgresql:databaseURL:dbname:ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory&') 但是我却遇到了错误: 'FATAL: password authentication failed for user "username"' 所以我使用了您的脚本,但得到了相同的错误。 我不得不添加以下行:

props.setProperty('ssl','true');

而不是如Matlab帮助中所说的使用SSLFactory...的正常URL。

所以这很好,但我不能使用数据库工具箱的函数...嗯,也不是很重要!

花了我一些时间才发现这一点,所以也许对于其他人有用的是,如果他们也遇到在SSL模式下连接远程数据库的问题。

谢谢!


0

不幸的是,这在postgresql上不起作用。但可能有一个更通用的解决方案通过ODBC/JDBC? - Philipp der Rautenberg

-1

(免责声明:需要数据库工具箱)
这是一个完整的示例,展示了如何从Matlab脚本中准备好设置PostgreSQL服务器,请根据需要调整数据库参数:

%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

你的用户需要具备登录权限角色,并能够访问表格( GRANT)。


因为问题明确指出“不使用matlab数据库工具箱”,所以被投下反对票。 - Saaru Lindestøkke
不公平,我在开头明确说明了,并为了完整性而添加。可能还有人在寻找它。 - droid192
很抱歉你觉得这不公平,但如果我的问题是“如何在不使用B的情况下做A”,而你的答案是“使用B”,而明显还有其他方法,我认为你的答案没有用,因此会被踩。 关于“人们可能正在寻找它”:当然。但是当他们在寻找没有工具箱的方法时就不是了。 如果你渴望分享你的知识(这很棒!),你可以自己提问(例如,如何从MATLAB连接到PostgreSQL),并提供自己的答案。 - Saaru Lindestøkke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接