2010-04-23 24 views

Trả lời

13

Để kết nối với postgres từ matlab mà không cần hộp công cụ cơ sở dữ liệu làm một cái gì đó tương tự như:

% 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

Từ kinh nghiệm của tôi, URL phải là: url = 'jdbc: postgresql: // : /'; (dấu gạch chéo ngược giữa '' và ' 'phải là dấu gạch chéo chuyển tiếp). Đây là khi chạy Matlab và máy chủ PostgreSQL trên cùng một máy tính Windows 7. –

+1

Tương tự đối với tôi trên Linux. Dấu gạch chéo ngược không hoạt động, forwardslash thực hiện. – luator

+0

Bạn nên đóng ResultSet sau khi bạn đọc xong các giá trị. Chỉ cần thêm rs.close(); để làm như vậy –

0

MYSQL(additional link) có hoạt động cho bạn, ít nhất là điểm khởi đầu không?

+0

Thật không may điều này không hoạt động với postgresql. Nhưng có lẽ có một giải pháp tổng quát hơn thông qua ODBC/JDBC? –

7

Là giải pháp chung, bạn chỉ có thể sử dụng JDBC trực tiếp. Tất cả các Matlabs hiện đại đều có một JVM được nhúng vào chúng. Lấy tệp JAR trình điều khiển JDBC của Postgresql trên Java CLASSPATH của bạn trong Matlab và bạn có thể xây dựng các đối tượng kết nối và tuyên bố JDBC. Xem "help javaclasspath".

Có một vài dấu hiệu. Việc đăng ký tự động các lớp trình điều khiển JDBC từ các JAR trên đường dẫn lớp động trong Matlab có vẻ hơi kỳ quặc, có thể vì nó sử dụng một trình nạp lớp URL riêng biệt và các lớp JDBC cốt lõi nằm trong bộ nạp lớp hệ thống. Vì vậy, bạn có thể cần phải xây dựng một cách rõ ràng các cá thể của lớp trình điều khiển JDBC và chuyển chúng vào các phương thức JDBC, thay vì sử dụng cấu trúc trình điều khiển ngầm mà bạn thấy trong tất cả các hướng dẫn JDBC. Ngoài ra, có phí thực hiện với mỗi cuộc gọi phương thức Java được thực hiện từ Matlab, điều này có thể trở nên tốn kém nếu bạn đang lặp qua một con trỏ thiết lập kết quả trong mã Matlab. Thật là đáng giá khi viết một lớp bao bọc mỏng trong Java sẽ bọc giao diện lặp của JDBC trong một giao diện kiểu Matlab theo định hướng khối, đọc trong các bộ kết quả và đệm chúng trong các mảng trong Java, và truyền toàn bộ mảng trở lại Matlab.

Bạn cũng có thể sử dụng ODBC, nhưng yêu cầu phải viết các tệp MEX được liên kết với ODBC hoặc làm việc với ADO. Khó khăn hơn và ít di động hơn.

EDIT: Bạn có thể nhận được các công cụ đăng ký trình điều khiển tự động để hoạt động ngay nếu bạn nhận được các JAR trên đường dẫn lớp Java tĩnh của bạn bằng cách sử dụng classpath.txt tùy chỉnh.

+0

Có, điều đó sẽ hoạt động tốt hơn nhiều so với giải pháp của tôi. – Jonas

1

Tôi đã có một vấn đề kết nối với một cơ sở dữ liệu pgsql với matlab với chế độ SSL. Sử dụng hộp công cụ cơ sở dữ liệu, nó phải giống như sau: conn = database ('dbname', 'username', 'password', 'org.postgresql.Driver', 'jdbc: postgresql: databaseURL: dbname: ssl = true & sslfactory = org.postgresql.ssl.NonValidatingFactory & ')

nhưng tôi đã có những lỗi: 'Fatal: xác thực mật khẩu sai đối với user 'username''

vì vậy, tôi sử dụng kịch bản của bạn và nhận được lỗi tương tự.

Tôi phải thêm dòng

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

và url bình thường, không phải với sslfactory ... như đã nói trong trợ giúp MATLAB.

Vì vậy, nó đẹp, nhưng tôi không thể sử dụng chức năng của hộp công cụ cơ sở dữ liệu ... tốt, không phải là nhiều của một việc lớn!

Hãy cho tôi một chút thời gian để tìm ra điều này, vì vậy có thể hữu ích khi người khác biết rằng nếu họ cũng gặp sự cố khi kết nối với cơ sở dữ liệu ở xa ở chế độ SSL.

cảm ơn!

6

Trước hết, liên kết ở trên cùng trong chính câu hỏi đã bị hỏng.Theo tôi biết, thư viện pgmex cũ này không còn được hỗ trợ nữa. Nhưng có một thư viện khách PostgreSQL hiệu năng cao hoàn toàn mới PgMex được viết 100% trong C và được liên kết với PostgreSQL 9.6 libpq mới nhất. Như đã được chỉ ra, bạn có thể sử dụng JDBC trực tiếp, nhưng IMHO thì tốt hơn ít nhất là sử dụng một trong những cách có sẵn để tăng tốc độ thực thi truy vấn. Ví dụ, bạn có thể áp dụng một cái gì đó như được mô tả trong một bài viết thú vị "Đẩy nhanh các truy vấn SQL Matlab-JDBC" được xuất bản trên trang web Matlab không có giấy tờ. Lý do chính cho hiệu suất giảm xuống của trình điều khiển JDBC PostgreSQL được kết nối với một đầu vào chuyển đổi dữ liệu quan trọng đến/từ các định dạng Matlab nguyên gốc (các đối tượng Java tới Matlab và ngược lại). Nhưng bản thân JDBC có những hạn chế nhất định mà không thể làm việc xung quanh cho các tập dữ liệu cơ bản lớn. Nó có thể dễ dàng nhìn thấy, ví dụ, nếu bạn phải đối phó với mảng. Chúng ta hãy xem bảng dưới đây so sánh hiệu suất chèn dữ liệu của phương thức datainsert từ Hộp công cụ cơ sở dữ liệu Matlab (làm việc với PostgreSQL là thông qua kết nối JDBC trực tiếp, để nó có thể được coi là đại diện có liên quan của các trình kết nối dựa trên JDBC) batchParamExec từ PgMex đề cập đối với trường hợp của các mảng:

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

đây n/a tương ứng với khối lượng dữ liệu mà nguyên nhân “ra khỏi bộ nhớ heap Java” vấn đề đối với phương pháp chèn định, Java kích thước heap cho tất cả những thí nghiệm này là tương đương với 939Mb . Để có kết quả của các thử nghiệm này và các thử nghiệm khác được trình bày dưới dạng đồ họa cũng như để biết thêm chi tiết về các thử nghiệm, vui lòng xem "Performance comparison of PostgreSQL connectors in Matlab" article sau đây).

Vì vậy, nếu bạn phải đối phó với dữ liệu có các loại vô hướng đơn giản và khối lượng không lớn, JDBC hoàn toàn có thể làm hài lòng bạn. Nhưng nếu không, IMHO tốt hơn là sử dụng các giải pháp dựa trên libpq như PgMex đã đề cập ở trên. Bên cạnh PgMex, có tồn tại, ví dụ, một gói mexPostgres nguồn mở (bạn có thể tìm thấy nó trên trang web Matlab Central) được viết bằng C++. Thư viện này phân tích dữ liệu dựa trên biểu diễn văn bản của nó (thông qua PQgetvalue chức năng từ libpq) và chỉ cho một danh sách rất hạn chế các kiểu dữ liệu (trên thực tế, chúng là số vô hướng và lôgic, thời gian, ngày, dấu thời gian và khoảng thời gian cũng như chuỗi , các kiểu phức tạp hơn như mảng lại một lần nữa nằm ngoài phạm vi). Nhưng việc truyền tải thông qua việc trình bày văn bản rất chậm và chỉ có thể được sử dụng cho các tập dữ liệu không lớn. Những gì liên quan đến PgMex, thư viện này thực hiện một kênh truyền dữ liệu nhị phân rất hiệu quả giữa Matlab và PostgreSQL mà không cần bất kỳ phân tích cú pháp văn bản nào. Bên cạnh đó, tất cả được thực hiện theo cách thân thiện với Matlab và bản địa (trong một dạng ma trận, mảng đa chiều, cấu trúc và các định dạng Matlab tùy ý khác).

Hãy để chúng tôi gợi ý cách giải quyết thư viện thứ hai dựa trên ví dụ được lấy từ một trong các câu trả lời ở trên, nhưng được viết lại bằng PgMex. Cụ thể, nhập dữ liệu được thực hiện bởi các đoạn mã sau (chúng tôi giả định rằng trong các mã dưới đây giá trị của tất cả các thông số đánh dấu bằng <> dấu hiệu được điền đúng cách cũng như bảng tương ứng đã tồn tại trong cơ sở dữ liệu):

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

Vui lòng xem tài liệu "getf" trên trang web PgMex để biết chi tiết về định dạng đầu vào và đối số đầu ra của chúng tôi (bao gồm fieldSpecStr). Mỗi phần tử của outCVec chứa cấu trúc có các trường valueVec, isNullVecisValueNullVec. Tất cả các trường này có kích thước dọc theo thứ nguyên đầu tiên trùng với số lượng bộ dữ liệu được thử lại, chứa các giá trị của trường bảng tương ứng , trong khi isNullVecisValueNullVec là chỉ số của NULL.

+0

hãy cẩn thận: không yêu cầu giấy phép ngay cả khi sử dụng cá nhân – ItsmeJulian

0

(DISCLAIMER: cần cơ sở dữ liệu hộp công cụ)
Đây là một ví dụ đầy đủ để một ready setup postgresql server từ một kịch bản matlab, điều chỉnh các thông số cơ sở dữ liệu cho phù hợp:

%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 

sử dụng của bạn cần vai trò quyền ĐĂNG NHẬP và có thể truy cập bảng (GRANT)

Các vấn đề liên quan