2010-04-23 45 views

回答

13

從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 
+5

根據我的經驗,URL應該是:url ='jdbc:postgresql:// /'; (''和''之間的反斜槓應該是正斜槓)。這是在同一臺Windows 7計算機上運行Matlab和PostgreSQL服務器的時候。 – 2011-07-13 13:13:51

+1

在Linux上也是如此。反斜槓不起作用。 – luator 2017-01-25 15:51:43

+0

讀完值後,建議關閉ResultSet。只需添加rs.close();要做到這一點 – 2017-08-04 20:32:50

0

MYSQL(additional link)爲你工作,至少作爲一個起點?

+0

不幸的是,這不適用於postgresql。但可能有更通用的解決方案通過ODBC/JDBC? – 2010-04-23 12:31:48

7

作爲一般的解決方案,您可以直接使用JDBC。現代的Matlabs都嵌入了JVM。在Matlab的Java CLASSPATH中獲取Postgresql JDBC驅動程序JAR文件,並且可以構建JDBC連接和語句對象。請參閱「幫助javaclasspath」。

有幾個陷阱。在Matlab的動態類路徑中自動註冊來自JAR的JDBC驅動程序類似乎有些古怪,也許是因爲它使用單獨的URL類加載器,而核心JDBC類位於系統類加載器中。因此,您可能需要顯式構建JDBC驅動程序類的實例並將它們傳遞給JDBC方法,而不是使用您在所有JDBC教程中看到的隱式驅動程序構造。此外,由Matlab構建的每個Java方法調用都會帶來性能開銷,如果您在Matlab代碼中循環使用結果集遊標,則可能會變得非常昂貴。用Java編寫一個薄層包裝器是值得的,它將JDBC的迭代接口封裝在一個面向塊的Matlab風格的接口中,讀取結果集並以Java數組形式緩存它們,並將整個數組傳回到Matlab。

您也可以使用ODBC,但這需要編寫針對ODBC鏈接的MEX文件或使用ADO。更難和便攜。

編輯:你也許可以得到自動驅動程序註冊的東西,如果你使用自定義classpath.txt得到你的靜態Java類路徑中的JAR工作的權利。

+0

是的,這應該比我的解決方案更好。 – Jonas 2010-04-23 18:14:03

1

我必須連接到數據庫的pgsql與SSL模式MATLAB的一個問題。使用數據庫工具箱,它應該是這樣的:美國康涅狄格州 =數據庫( 'DBNAME', '用戶名', '密碼', 'org.postgresql.Driver','爲jdbc:在PostgreSQL:databaseURL:DBNAME:SSL =真& sslfactory = org.postgresql.ssl.NonValidatingFactory &「)

,但我有錯誤: ‘致命:密碼驗證失敗的用戶‘用戶名’’

於是我就用你的腳本,並得到了同樣的錯誤。

我不得不添加行

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

和正常的網址,不與sslfactory ...正如在matlab幫助說的。

所以這是很好的,但我不能使用數據庫工具箱的功能...好,沒有那麼多大不了的!

我花了一些時間來找到了這一點,所以也許它可能是有用的其它知道,如果他們還連接到在SSL模式下一個遙遠的數據庫問題。

謝謝!

6

首先,問題本身頂部的鏈接已經被打破。據我所知,這個舊的pgmex庫不再被支持。但是有一個全新的高性能PostgreSQL客戶端庫PgMex 用C語言編寫,並且與最新的PostgreSQL 9.6 libpq鏈接​​。

正如已經指出的那樣,您可以直接使用JDBC,但恕我直言,最好至少使用其中一種可用的方法來加快查詢的執行速度。例如,您可以應用類似於在Undocumented Matlab網站上發佈的有趣文章「加快Matlab-JDBC SQL查詢」中所述的內容。造成PostgreSQL JDBC驅動程序性能下降的主要原因與原始Matlab格式(從Java對象到Matlab,反之亦然)之間的重要數據轉換開銷相關。 但是JDBC本身具有某些侷限性,對於基本上較大的數據集無法解決。例如,可以很容易地看到,如果你必須處理數組。讓我們看一下下表,比較Matlab Database Toolbox中的datainsert方法的數據插入性能(使用PostgreSQL即通過直接JDBC連接,以便它可以被認爲是基於JDBC的連接器的相關代表),其中之一是batchParamExec自提PgMex爲陣列的情況下:

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

這裏n/a對應於數據量造成「出Java堆存儲器的」問題對於給定的插入方法,對於所有這些實驗中的Java堆大小等於939Mb 。對於以圖形形式呈現的這些和其他實驗的結果以及實驗的進一步細節,請參見以下 "Performance comparison of PostgreSQL connectors in Matlab" article)。因此,如果您不得不處理簡單標量類型且體積不是很大的數據,那麼JDBC可能會完全滿足您。但是否則 最好是使用上面提到的PgMex等基於libpq的解決方案。除了PgMex之外,還有一些用C++編寫的開源軟件包mexPostgres(可以在Matlab Central網站上找到)。此庫 根據其文本表示(通過PQgetvalue函數從libpq)解析數據,並且僅用於非常有限的數據類型列表 (事實上,它們是標量數字和邏輯,時間,日期,時間戳和間隔以及字符串,像數組這樣的更復雜的類型再次超出了範圍)。但是,通過文本表示的傳輸非常緩慢,並且可能僅用於不是非常大的數據集。關於PgMex,這個庫在Matlab和PostgreSQL之間實現了一個非常有效的二進制數據傳輸通道,沒有任何文本解析。此外,所有這些都以Matlab友好和本地方式完成(以矩陣,多維數組,結構和任意其他Matlab格式)。

讓我們給出一個提示如何處理後面的庫,基於上面的答案之一的例子,但使用PgMex重寫。也就是說,數據導入是通過下面的代碼來實現(我們假設下面所有<>標誌標明的參數值的代碼是否正確填寫,以及對應的數據庫表中已經存在):

% 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{:}); 

有關輸入 和輸出參數(包括fieldSpecStr)格式的詳細信息,請參見PgMex網站上的「getf」文檔。 outCVec 的每個元素包含具有字段valueVec,isNullVecisValueNullVec的結構。所有這些字段的第一個維度的大小爲 ,與檢索的元組數相符,valueVec包含 各個表字段的值,而isNullVecisValueNullVec是空值的指示符。

+0

要小心:非免費需要許可證,甚至個人使用 – ItsmeJulian 2017-10-12 16:02:36

0

(免責聲明:需要數據庫工具箱)
下面是一個完整的例子從MATLAB腳本ready setup postgresql server,相應地調整數據庫參數:

%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

相關問題