我有一个 Spring boot 应用程序,它使用 SQLite db 来执行 CRUD 操作。当我尝试向数据库中插入一行时,总是收到此错误。我希望能够使用 sqlite 数据库执行 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 文件位于 maven 项目中的 src/main/resources/mydb.db
位置。我在应用程序属性中尝试了以下配置。
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 帖子
resources in a Spring Boot application are missing from jar file when using Spring Boot Maven Plugin
这是将代码插入数据库的方法。
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配置为suggested by plugin documentation下面给出。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
</build>
最佳答案
看起来您正在尝试将数据库放入资源 src/main/resources/mydb.db
但根据 spring.datasource.url=jdbc:sqlite:mydb.db
spring 正在寻找 jar/执行目录旁边的 db。
我认为你实际上应该选择一个
- 使用
spring.datasource.url=jdbc:sqlite::resource:mydb.db
语法访问 JAR 存档中包含的只读 DB 文件 More info 将数据库放在 jar 之外。在 IDE 中,它可能位于 src 目录附近:
projectRoot/ src/ mydb.db
并保留
spring.datasource.url=jdbc:sqlite:mydb.db
。
关于java - Spring Boot应用程序无法检测sqlite db文件中定义的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47108612/