我在我的应用程序中使用PostgreSQL和ORMlite,它在Windows服务器上运行。在创建所有表之前,我需要验证Postgres中是否存在数据库,如果不存在,我必须创建它。
我已经拥有了我的SQL Raw:
检查是否存在:
final String SQL = "SELECT 1 from pg_database WHERE datname='MY_NOME_DB' ;";
创建它(如果不存在):
String SQL= "CREATE DATABASE MY_NOME_DB ; " ;
问题:如何使用ORMLite执行此操作? 我知道要执行原始SQL我可以使用:
myDAO.executeRaw(SQL);
但是这里不是特定的表,所以我不能使用它因为我无法创建myDAO。
答案 0 :(得分:1)
我没有找过它,但可能还有其他(更好的)解决方案,而不是你的。
通常,它不是耦合应用程序和基础结构的好方法。您的PostgreSql是您的基础架构的一部分,您的应用程序不应该关心您的基础架构是否已设置。
更好的方法是分割您的基础架构定义,可能使用简单的Bash脚本或(理想情况下)类似Terraform和不要将您的应用程序与您的基础架构耦合
答案 1 :(得分:1)
我也同意这不是好习惯 但是你的意图可以在ormLite中使用 您可以使用原始查询任何DAO。 DAO并没有严格限制在表格中。
参考我的示例代码。
sqls.xml
:它包含原始查询。您可以定义任何原始查询。
<item name="sql_login" type="string">
SELECT AdminPubTBL.*
FROM PDARunPubTBL
JOIN AdminPubTBL ON PDARunPubTBL.AdminSeqNo = AdminPubTBL.AdminSeqNo
.....
AND AdminPubTBL.AdminPwd = \'@adminPwd\' LIMIT 1
</item>
adminDao.java
public interface AdminDao {
Admin login(int pdaSeqNo, int sectionSeqNo, String adminId, String adminPwd, String corpCode);
adminDaoOrmLite.java
:您可以使用queryRaw
并返回任何Java对象。
public class AdminDaoOrmLite implements AdminDao {
@Nullable
private DatabaseHelper databaseHelper = null;
@Nullable
private Dao<Admin, Integer> adminDao = null;
public Admin login(int pdaSeqNo, int sectionSeqNo, @NonNull String adminId, String adminPwd, String corpCode) {
String sql = context.getResources().getString(R.string.sql_login)
.replace("@pdaSeqNo", String.valueOf(pdaSeqNo))
.replace("@sectionSeqNo", String.valueOf(sectionSeqNo))
.replace("@adminId", adminId)
.replace("@adminPwd", hashedPassword(adminPwd,corpCode));
try {
return adminDao.queryRaw(sql, adminDao.getRawRowMapper()).getFirstResult();
} catch (SQLException e) {
LOG.error(e);
}
}
所以如果你想要原始查询。制作公共DAO,然后执行.queryRaw()