2009-12-23 36 views
12

Làm cách nào để nhập tệp kết xuất cơ sở dữ liệu mysql (chứa chèn và tạo bảng câu lệnh) theo chương trình java. Tôi cần điều này như là giai đoạn thiết lập của một bài kiểm tra đơn vị.Nhập một kết xuất cơ sở dữ liệu (mysql) theo cách lập trình thông qua Java

Thật không may điều này không làm việc:

Connection conn = dbConnectionSource.getConnection(); 
Statement stmt = conn.createStatement(); 
stmt.execute(FileUtils.readFileToString(new File("./some-sql-file"))); 
conn.close(); 

Cảm ơn, -A

PS - Trong Rails, tôi sử dụng đồ đạc cho điền một cơ sở dữ liệu thử nghiệm. Tôi đã tạo ra các đường ray tạo ra các bảng bên dưới thông qua việc thiết lập môi trường để kiểm tra, bất kỳ thứ gì tương tự trong Java.

+1

"thực dụng" phải là "theo lập trình" –

Trả lời

10

Bạn có thể bắt đầu một quá trình mới từ java và thực hiện lệnh này nếu bạn có quyền truy cập vào các mysql thực thi bất cứ nơi nào bạn đang chạy nhập. Một cái gì đó như thế này:

Runtime rt = Runtime.getRuntime(); 
Process pr = rt.exec("mysql -p -h ServerName DbName < dump.sql"); 
+0

Đây là cách * đúng * để thực hiện việc này. Bất kỳ cách nào khác có thể không hoạt động trong các trường hợp cạnh tinh tế. Mysql bãi được viết để được nhập khẩu với các khách hàng mysql, không phải bất kỳ công cụ khác. – MarkR

+1

Chỉ cần sửa chữa, chúng tôi không thể sử dụng chuyển hướng như thế trong java: Quy trình pr = rt.exec (chuỗi mới [] {"/ bin/bash", "- c", "mysql -p -h Tên máy chủ DbName

+1

bất kỳ ý tưởng nào về cách thực hiện điều này trong Windows? –

2

Cá nhân tôi sẽ không khuyến nghị tải một kết xuất SQL thông thường theo cách này, vì bạn sẽ cần mã không tầm thường để phân tích cú pháp hoặc ít nhất là mã hóa SQL.

Tôi khuyên bạn nên sử dụng các bãi dữ liệu CSV, bạn có thể tải chúng bằng cú pháp LOAD DATA INFILE. Xem: http://dev.mysql.com/doc/refman/5.1/en/load-data.html

Tất nhiên, bạn vẫn cần đảm bảo bảng mục tiêu tồn tại, nhưng nếu bạn biết bạn chỉ phải phân tích cú pháp tạo bảng DDL, điều này sẽ đơn giản hóa mã java của bạn.

Lưu ý rằng bạn có thể sử dụng mysqldump để trích xuất dữ liệu CSV từ cơ sở dữ liệu của bạn, xem: http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_tab

2

sao lưu:

/******************************************************/ 
//Database Properties 
/******************************************************/ 
String dbName = “dbName”; 
String dbUser = “dbUser”; 
String dbPass = “dbPass”; 

/***********************************************************/ 
// Execute Shell Command 
/***********************************************************/ 
String executeCmd = “”; 
executeCmd = “mysqldump -u “+dbUser+” -p”+dbPass+” “+dbName+” -r backup.sql”; 
} 
Process runtimeProcess =Runtime.getRuntime().exec(executeCmd); 
int processComplete = runtimeProcess.waitFor(); 
if(processComplete == 0){ 

out.println(“Backup taken successfully”); 

} else { 

out.println(“Could not take mysql backup”); 

} 

Restore:

/******************************************************/ 
//Database Properties 
/******************************************************/ 
String dbName = “dbName”; 
String dbUser = “dbUser”; 
String dbPass = “dbPass”; 

/***********************************************************/ 
// Execute Shell Command 
/***********************************************************/ 
String executeCmd = “”; 

executeCmd = new String[]{“/bin/sh”, “-c”, “mysql -u” + dbUser+ ” -p”+dbPass+” ” + dbName+ ” < backup.sql” }; 

} 
Process runtimeProcess =Runtime.getRuntime().exec(executeCmd); 
int processComplete = runtimeProcess.waitFor(); 
if(processComplete == 0){ 

out.println(“success”); 

} else { 

out.println(“restore failure”); 

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