当前位置: 首页 > 知识库问答 >
问题:

Spring boot应用程序无法检测sqlite db文件中定义的表

宰父跃
2023-03-14

我有一个Spring boot应用程序,它使用SQLite db执行CRUD操作。当我试图在数据库中插入一行时,总是会出现这个错误。我希望能够使用sqlite db执行CRUD操作。下面给出了我的堆栈跟踪

org.sqlite.SQLiteException: [SQLITE_ERROR] SQL error or missing database (no such table: Chats)
    at org.sqlite.core.DB.newSQLException(DB.java:909) ~[sqlite-jdbc-3.15.1.jar:na]
    at org.sqlite.core.DB.newSQLException(DB.java:921) ~[sqlite-jdbc-3.15.1.jar:na]
    at org.sqlite.core.DB.throwex(DB.java:886) ~[sqlite-jdbc-3.15.1.jar:na]
    at org.sqlite.core.NativeDB.prepare_utf8(Native Method) ~[sqlite-jdbc-3.15.1.jar:na]
    at org.sqlite.core.NativeDB.prepare(NativeDB.java:127) ~[sqlite-jdbc-3.15.1.jar:na]
    at org.sqlite.core.DB.prepare(DB.java:227) ~[sqlite-jdbc-3.15.1.jar:na]
    at org.sqlite.core.CorePreparedStatement.<init>(CorePreparedStatement.java:41) ~[sqlite-jdbc-3.15.1.jar:na]
    at org.sqlite.jdbc3.JDBC3PreparedStatement.<init>(JDBC3PreparedStatement.java:30) ~[sqlite-jdbc-3.15.1.jar:na]
    at org.sqlite.jdbc4.JDBC4PreparedStatement.<init>(JDBC4PreparedStatement.java:19) ~[sqlite-jdbc-3.15.1.jar:na]
    at org.sqlite.jdbc4.JDBC4Connection.prepareStatement(JDBC4Connection.java:48) ~[sqlite-jdbc-3.15.1.jar:na]
    at org.sqlite.jdbc3.JDBC3Connection.prepareStatement(JDBC3Connection.java:254) ~[sqlite-jdbc-3.15.1.jar:na]
    at org.sqlite.jdbc3.JDBC3Connection.prepareStatement(JDBC3Connection.java:226) ~[sqlite-jdbc-3.15.1.jar:na]
    at org.springframework.jdbc.core.JdbcTemplate$SimplePreparedStatementCreator.createPreparedStatement(JdbcTemplate.java:1524) ~[spring-jdbc-4.3.12.RELEASE.jar:4.3.12.RELEASE]
... 

这是不正确的,因为我可以在文件中看到在SQLite客户端中创建的表的DDL。

SQLite db文件位于src/main/resources/mydb。dbmaven项目中的位置。我在应用程序属性中尝试了以下配置。

spring.datasource.url=jdbc:sqlite:mydb.db
spring.datasource.driver-class-name=org.sqlite.JDBC
spring.jpa.database-platform=com.myproject.assignment.SqliteDialect
spring.datasource.username=
spring.datasource.password=
spring.jpa.hibernate.ddl-auto=create
spring.jpa.show-sql=true

方言的配置取自以下SO帖子

>

Spring boot和SQLite

使用Spring Boot Maven插件时,jar文件中缺少Spring Boot应用程序中的资源

下面是将代码插入数据库的方法

public long insertChatRecord(final ChatRecord chatRecord) {
    if (LOGGER.isDebugEnabled()) {
      LOGGER.debug("Inserting chat record: " + chatRecord);
    }
    DateTime dateTime = DateTime.now().withZone(DateTimeZone.UTC);
    DateTime expirationTime = dateTime.plusSeconds(
        chatRecord.getTimeout() != null ? chatRecord.getTimeout().intValue(): 60);
    final String timestamp = expirationTime.toString(TIMESTAMP_FORMAT);
    long chatId = SequenceGenerator.getInstance().next();
    chatRecord.setChatId(chatId);
    chatRecord.setExpirationTimestamp(expirationTime);
    StringBuilder sb = new StringBuilder();
    sb.append("INSERT INTO Chats(chat_id, username, chat_text, expiration_date) ");
    sb.append("VALUES(?, ?, ?, ?)");
    jdbcTemplate.update(sb.toString(), new PreparedStatementSetter() {

      @Override
      public void setValues(PreparedStatement ps)
          throws SQLException, DataAccessException {
        // TODO Auto-generated method stub
        ps.setLong(1, chatRecord.getChatId());
        ps.setString(2,  chatRecord.getUsername());
        ps.setString(3,  chatRecord.getText());
        ps.setString(4, timestamp);
      }});
    return chatId;
  }

例外情况在这一行提出。

jdbcTemplate.update(sb.toString(), new PreparedStatementSetter() {

      @Override
      public void setValues(PreparedStatement ps)
          throws SQLException, DataAccessException {
        // Setting values for prepared statement.
      }});

我不知道我做错了什么。我正在Eclipse中运行Spring Boot应用程序。主要类别如下:

@SpringBootApplication
public  class Application {

  public static void main(String[] args) throws Exception {
    SpringApplication.run(Application.class, args);
  }

}

我的pom.xml配置建议插件留档如下。

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <addResources>true</addResources>
                </configuration>
            </plugin>
        </plugins>
    </build>

共有2个答案

成浩漫
2023-03-14

答案是在数据库的初始化。部分https://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html

我必须添加一个创建表的schema.sql。schema.sql被添加到src/main/Resources目录。这里是它的内容

DROP TABLE IF EXISTS Chats;CREATE TABLE IF NOT EXISTS Chats(username VARCHAR(20), chat_text VARCHAR(256), chat_id BIGINT, expiration_date TIMESTAMP, PRIMARY KEY(chat_id) )
章琛
2023-03-14

看起来你正试图把你的数据库放在资源src/main/Resources/mydb.db中,但是根据spring.datasource.url=jdbc: sqlite:mydb.dbSpring正在寻找你的jar/旁边的数据库执行目录。

我觉得你应该选一个

>

  • 使用spring.datasource.url=jdbc: sqlighte::资源:mydb.db语法访问JAR存档中包含的只读DB文件更多信息
  • 把你的数据库放在罐子外面。在IDE中,它可能在src目录附近:

    projectRoot/
       src/
       mydb.db
    

    保持spring。数据源。url=jdbc:sqlite:mydb。db

  •  类似资料:
    • 我使用Maven作为我的构建工具。对于配置文件管理在SpringBoot我使用yml文件。 对于我的SpringBoot应用程序,我设置了以下应用程序-*. yml文件: 我对应的pom。xml配置文件配置: 每当我试图通过Maven打包或运行我的应用程序时: 应用程序运行,但它只会返回默认配置文件(application.yml)运行。每次尝试在任何配置的配置文件下运行应用程序时,我都会获得以下

    • 集成测试: 当我偶尔运行这个测试时,一切都很好,但是当我和其他测试一起运行它时,没有使用模拟的ServerThroughRabbitMQ,所以一些spring缓存强制使用旧的rabbit侦听器。 我试图调试它,我可以看到,正确的bean被autowired到测试中,但由于某些原因旧监听器使用(旧bean字段instanceID=1新mocked bean instanceID=3),测试失败(不确

    • 这是我在Android上使用Mac上的Appium时遇到的问题。 Appium无法从我的应用程序中检测到活动。它在这个应用程序的另一个版本中检测到了这些,并且我已经和开发人员确认了我使用了正确的appname和activity name。

    • 我有一个应用类 我有控制器课 并且,我想为Application test编写一个测试用例,以确保创建的实例类型为HelloController 但是,我在自动连接 hello控制器变量时遇到错误(找不到 hello 控制器类型的 bean)。根据我的理解,@SpringBootTest应该创建上下文并返回一个实例。我们不需要编写任何上下文 xml 或使用任何注释Config 类来获取实例。缺少了

    • 我有一个springboot应用程序,我试图使用ByteBuddy来测试它。我遇到了类路径问题,我无法理解。 首先,以下是关于这方面的其他文献: https://github.com/raphw/byte-buddy/issues/473 这里需要注意的一点是,如果我使用IntelliJ运行应用程序,它不会使用uber-jar,而是通过main类运行,其中有一堆JAR作为类路径参数。 由于这种差异

    • 问题内容: 您可以在不使用元素的情况下在Spring application-context.xml文件中创建列表吗? 我有一个其构造函数带有对象的bean,并且我想通过“ value”属性传递整个列表。原因是此值来自.properties文件,您无法在.properties文件中定义列表。 我想做这样的事情…可能吗? MyClass.java: application-context.xml: