Вот небольшая программа. Он написан на Java, но будет работать аналогичным образом на другом языке. Это полностью автономно. Я пытался сделать его минималистичным, но это все же может быть хорошей отправной точкой.
Это делает:
- чтение в JSON с библиотекой GSON
- Импорт данных в базу данных Postgres через подготовленные операторы JDBC
Результат
С помощью программы командной строки psql
, запрашивающей TableA и TableB возвращает:
stephan=# select * from TableA;
id | title | name | language | description
----+----------+---------+----------+----------------------
1 | facebook | abc_xyz | English | This is a test
2 | Twitter | abc_xyz | French | This is another test
(2 rows)
stephan=# select * from TableB;
association_id | tablea_id | category_id | last_update_time
----------------+-----------+-------------+----------------------------
29 | 1 | 28 | 2019-06-13 18:04:52.671833
30 | 1 | 29 | 2019-06-13 18:04:52.671833
31 | 1 | 30 | 2019-06-13 18:04:52.671833
32 | 1 | 31 | 2019-06-13 18:04:52.671833
33 | 2 | 2 | 2019-06-13 18:04:52.692635
34 | 2 | 23 | 2019-06-13 18:04:52.692635
35 | 2 | 35 | 2019-06-13 18:04:52.692635
(7 rows)
Java
import java.util.Properties;
import java.sql.*;
import com.google.gson.Gson;
class Entry {
int id;
String name;
String language;
String title;
String description;
String[] categories;
}
public class Main {
public static void main(String[] args) {
String json = "[{\"id\":\"1\",\"name\":\"abc_xyz\",\"language\":\"English\",\"title\":\"facebook\",\"description\":\"This is a test\",\"categories\":[\"https://facebook/category/28\",\"https://facebook/category/29\",\"https://facebook/category/30\",\"https://facebook/category/31\"]},{\"id\":\"2\",\"name\":\"abc_xyz\",\"language\":\"French\",\"title\":\"Twitter\",\"description\":\"This is another test\",\"categories\":[\"https://twitter/category/2\",\"https://twitter/category/23\",\"https://twitter/category/35\"]}]";
try {
Entry[] entries = readJSON(json);
importIntoDB(entries);
} catch (Exception e) {
e.printStackTrace();
}
}
private static Entry[] readJSON(String json) {
Entry[] entries;
Gson g = new Gson();
entries = g.fromJson(json, Entry[].class);
return entries;
}
private static Connection createConnection()
throws ClassNotFoundException, SQLException {
Class.forName("org.postgresql.Driver");
String url = "jdbc:postgresql://localhost/stephan";
Properties props = new Properties();
props.setProperty("user", "stephan");
props.setProperty("password", "secret");
//props.setProperty("ssl", "true");
return DriverManager.getConnection(url, props);
}
private static void importIntoDB(Entry[] entries)
throws SQLException, ClassNotFoundException {
Connection connection = createConnection();
try (connection) {
connection.setAutoCommit(false);
PreparedStatement insertTableA = connection.prepareStatement(
"INSERT INTO TableA (id, name, language, title, description) VALUES(?, ?, ?, ?, ?)");
PreparedStatement insertTableB = connection.prepareStatement(
"INSERT INTO TableB (TableA_Id, Category_Id) VALUES (?, ?)");
for (Entry entry : entries) {
insertTableA.setInt(1, entry.id);
insertTableA.setString(2, entry.name);
insertTableA.setString(3, entry.language);
insertTableA.setString(4, entry.title);
insertTableA.setString(5, entry.description);
insertTableA.execute();
for (String category : entry.categories) {
insertTableB.setInt(1, entry.id);
String categoryIdString = category.substring(category.lastIndexOf('/') + 1);
int categoryId = Integer.parseInt(categoryIdString);
insertTableB.setInt(2, categoryId);
insertTableB.execute();
}
connection.commit();
}
insertTableA.close();
insertTableB.close();
}
}
}
Обязательные библиотеки
Для вышеупомянутой программы требуется библиотека Postgres JDBC и библиотека GSON для десериализации JSON.
Вы можете скачать его здесь:
https://jdbc.postgresql.org/download.html
http://central.maven.org/maven2/com/google/code/gson/gson/2.8.5/gson-2.8.5.jar
Порции
Если вам нужно импортировать большое количество записей, вы можете подумать о том, чтобы объединить PreparedStatements в пакеты и затем выполнить много операторов одновременно, взгляните на методы addBatch и executeBatch.