我已阅读了几篇帖子,但仍然无法弄清楚这里有什么问题。 我有一个c ++包装器来调用sqlite。我想在创建表之前测试表是否存在,通过阅读check-in-sqlite-whether-a-table-exists,我使用以下sql语句来检查表是否存在
" SELECT name FROM test.db WHERE type =' table' AND name =' table1';"
主要代码如下:
static int callback(void *db, int argc, char **argv, char **azColName){
for(int i=0; i<argc; ++i){
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
return 0;
}
class SqliteAccessor {
public:
open(){ sqlite3_open("test.db", &m_db); }
createTable1(){
string sql = "CREATE TABLE table1(one TEXT);";
char *zErrMsg = 0;
int rc = sqlite3_exec(m_db, sql.c_str(), callback, 0, &zErrMsg);
if( rc != SQLITE_OK ){
printf("SQL error: %s", zErrMsg);
sqlite3_free(zErrMsg);
}
}
hasTable1(){
string sql = "SELECT name FROM test.db WHERE type='table' AND name='table1'";
char *zErrMsg = 0;
int rc = sqlite3_exec(m_db, sql.c_str(), callback, 0, &zErrMsg);
if( rc != SQLITE_OK ){
printf("SQL error: %s", zErrMsg); // Error: no such table: test.db
sqlite3_free(zErrMsg);
}
}
private:
sqlite3* m_db;
}
main(){
SqliteAccessor sql;
sql.open(); // success;
sql.createTable1(); // success;
sql.hasTable1(); // fail
}
我也尝试过使用cli api:
sqlite3 test.db
sqlite> create table table1(one varchar(10));
sqlite> SELECT * FROM test.db;
Error: no such table: test.db
sqlite> SELECT name FROM test.db WHERE type='table' AND name='table1';
Error: no such table: test.db
// however, if I run .tables, then it is there.
sqlite> .tables
table1
它是同样的错误,但为什么会出现这样的错误?它是最新的sqlite合并版本。
答案 0 :(得分:1)
请查看sqlite_master。
SELECT * FROM sqlite_master WHERE name LIKE '%your_table_name%'