java - 如何使用bash或java将三个不同的sqlite3数据库D1、D2和D3附加到另一个数据库D4

标签 java shell sqlite

我在同一文件夹中有 3 个不同的数据库,如下所示

enter image description here

我想将其他 3 个数据库附加到 joined.db 数据库,然后创建一个名为 join1 的表,如下所示

public class attaching_DB {


public static void main(String args[]) {
    Connection c = null;
    Statement stmt = null;

    try {
        Class.forName("org.sqlite.JDBC");


        String database_path = "/Users/amar/Documents/ThesisCode/CEP_Architectures/databases/joined.db";

        c = DriverManager.getConnection("jdbc:sqlite:" + database_path);


        System.out.println("connection to sql is made");

        stmt = c.createStatement();




        // attaching all the tables in joined database
        String a1 = "ATTACH DATABASE 'mobile_data.db' as 'mobile';" ;
        String a2 = "ATTACH DATABASE 'server_data.db' as 'server';" ;
        String a3 = "ATTACH DATABASE 'flink_data.db' as 'flink';" ;


        stmt.execute(a1);
        stmt.execute(a2);
        stmt.execute(a3);


        String b1 =  "CREATE TABLE if not EXISTS  mobile_events as select * from mobile.mobile_events;"   ;
        String b2 =  "CREATE TABLE if not EXISTS  server_events  as select * from server.server_events;" ;
        String b3 =  "CREATE TABLE if not EXISTS  flink_events  as select * from flink.flink_events;"  ;

        stmt.executeUpdate(b1);
        stmt.executeUpdate(b2);
        stmt.executeUpdate(b3);


        // joining mobile and server data
        String join1 = "CREATE TABLE  if not EXISTS join1 as select M.patientid, M.sensorid , M.uid , M.egtl, M.egtg, S.eatg, M.valuez from mobile_events M inner join server_events S  on M.sensorid = S.sensorid and  M.uid = S.uid ; " ;
        stmt.executeUpdate(join1);



        stmt.close();
        c.commit();
        c.close();
    } catch (Exception e) {
        System.err.println(e.getClass().getName() + ": " + e.getMessage());
        System.exit(0);
    }
    System.out.println("attach is successful");
}

}

我收到以下错误

org.sqlite.SQLiteException: [SQLITE_ERROR] SQL error or missing database (no such table: mobile.mobile_events)

问题是附加不起作用,我尝试使用可执行文件 bash 执行相同的操作,如下所示,但是当执行 sqlite3 join.db 时,会打开一个新选项卡并且脚本停止

    #! /bin/bash
clear
cd /Users/amar/Documents/ThesisCode/CEP_Architectures/databases/
#starting sqlite3
sqlite3 joined.db

# attaching other db's
ATTACH DATABASE 'mobile_data.db' as 'mobile';
ATTACH DATABASE 'server_data.db' as 'server';
ATTACH DATABASE 'flink_data.db' as 'flink';

# creating tables
CREATE TABLE mobile_events as select * from mobile.mobile_events;
CREATE TABLE server_events as select * from server.server_events;
CREATE TABLE server_events as select * from server.server_events;

# crate a joined table
CREATE TABLE join1 as select M.patientid, M.sensorid , M.uid , M.egtl, M.egtg, S.eatg, M.valuez from mobile_events M inner join server_events S  on M.sensorid = S.sensorid and  M.uid = S.uid ;
echo "program is complete"

P.S:我可以通过在终端中手动编写这些脚本来附加数据库并创建表 join1,但由于我正在做一些实验,所以我不想一次又一次地这样做

提前致谢!

最佳答案

您将 SQL 语句传递给 bash,而 bash 无法理解它们。将它们传递给 sqlite3,例如:

#! /bin/bash
clear
cd /Users/amar/Documents/ThesisCode/CEP_Architectures/databases/
#starting sqlite3
sqlite3 joined.db <<EOF

-- attaching other db's
ATTACH DATABASE "mobile_data.db" as mobile;
ATTACH DATABASE "server_data.db" as server;
ATTACH DATABASE "flink_data.db" as flink;

-- creating tables
CREATE TABLE mobile_events as select * from mobile.mobile_events;
CREATE TABLE server_events as select * from server.server_events;
CREATE TABLE flink_events as select * from flink.flink_events;

-- create a joined table
CREATE TABLE join1 as select M.patientid, M.sensorid , M.uid , M.egtl, M.egtg, S.eatg, M.valuez from mobile_events M inner join server_events S  on M.sensorid = S.sensorid and  M.uid = S.uid ;

EOF

echo "program is complete"

关于java - 如何使用bash或java将三个不同的sqlite3数据库D1、D2和D3附加到另一个数据库D4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48087236/

相关文章:

java - spliterator getExactSizeIfKnown 与estimateSize

linux - 日期/时间参数不正确

c# - 将 SQLite Blob 转换为十六进制再转换为字符串

ios - 难以处理 SQLite 中的编码

sql - 在 SQLite 中连接三个表的最佳方式

java - 如何使用 Channel BufferOutputStream 检查压缩大小

java - 在 Java 中使用正则表达式在第一个逗号之后和两个大写字母和一个逗号之前提取字符串

java - 启动 Android Activity 会出现 NullPointerException

Bash 的源命令无法处理来自互联网的 curl 文件

python - Ansible IP 地址可变远程主机