如何在数据库上执行原始 SQL(而不是在特定 table 上)
How to execute raw SQL on DB (not on specific table)
我在我的应用程序中使用 PostgreSQL 和 ORMlite,它们在 Windows 服务器上运行。在创建所有 table 之前,我需要验证数据库是否存在于 Postgres 中,如果不存在,我必须创建它。
我已经有了 SQL 原始的:
检查是否存在:
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);
但是这里不在特定的table上,所以我不能使用它,因为我不能创建myDAO。
我没有寻找它,但除了你的之外可能还有其他(更好的)解决方案。
通常,将应用程序和基础结构耦合起来并不是一个好的方法。您的 PostgreSql 是您的基础设施的一部分,您的应用程序不应该关心您的基础设施是否已设置。
更好的方法是拆分您的基础架构定义,可能使用简单的 Bash 脚本或(理想情况下)类似 Terraform 和 不要耦合 您的基础设施中的应用程序。
我也同意这不是好的做法。
但是您的意图在 ormLite 中是可能的。
您可以使用原始查询任何 DAO。 DAO 在 table.
中没有严格的限制
参考我的示例代码。
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
:您可以对任何 Java 对象使用 queryRaw
和 return。
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()
我在我的应用程序中使用 PostgreSQL 和 ORMlite,它们在 Windows 服务器上运行。在创建所有 table 之前,我需要验证数据库是否存在于 Postgres 中,如果不存在,我必须创建它。
我已经有了 SQL 原始的:
检查是否存在:
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);
但是这里不在特定的table上,所以我不能使用它,因为我不能创建myDAO。
我没有寻找它,但除了你的之外可能还有其他(更好的)解决方案。
通常,将应用程序和基础结构耦合起来并不是一个好的方法。您的 PostgreSql 是您的基础设施的一部分,您的应用程序不应该关心您的基础设施是否已设置。
更好的方法是拆分您的基础架构定义,可能使用简单的 Bash 脚本或(理想情况下)类似 Terraform 和 不要耦合 您的基础设施中的应用程序。
我也同意这不是好的做法。
但是您的意图在 ormLite 中是可能的。
您可以使用原始查询任何 DAO。 DAO 在 table.
参考我的示例代码。
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
:您可以对任何 Java 对象使用 queryRaw
和 return。
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()