如下圖所示,函式首先開啟兩個資料庫,然後獲取兩個資料庫的版本資訊。根據資料庫各個表名稱來開啟相應的表,然後判斷兩個表的具體內容是否相同,如果不同的話則列印出該表名,如果使用者選擇列印具體內容的話,則分別列印兩個表的具體內容(由於表的內容可能會比較多,且檢視單個表內容的話使用sqlite軟體看更直觀,所以這個功能預設關閉)。
/**@brief 資料庫查詢返回結構
*/typedef structquery_table;
/**@brief 根據要查詢的內容輸入sql語句,返回要查詢的資料集
* @param[in] database * db 資料庫的連線控制代碼,不能為null
* @param[in] char *sql 要查詢的sql語句,可以在資料庫中正常執行的,不能為null
* @param[out] query_table *ds 返回的查詢結果結構體
* @return int sqlite_ok 查詢獲取成功; 其他都是失敗
*/int db_query_open_v2 (sqlite3 *db, const char *table_name, query_table *ds);
if( (null == db)||(null == table_name) )
sprintf(sql, "select * from %s", table_name);
ret = sqlite3_get_table(db, sql, &(ds->data), &(ds->rows), &(ds->column), &errmsg);
if (ret != sqlite_ok)
return ret;
}/**@brief 關閉並釋放查詢返回的資料
* @param[in] query_table *ds 返回的查詢結果結構體
* @return 無
*/void db_query_close_v2 (query_table *ds)
}/**@brief 比較兩個表是否不同
* @param[in] query_table *table1 資料庫1的表
* @param[in] query_table *table2 資料庫2的表
* @param[out]
* @return false:兩個表不同
true:兩個表相同
*/int compare_tables(query_table *table1, query_table *table2)
/*兩個表的行列數不同,則肯定不相等*/
if (table1->rows != table2->rows ||
table1->column != table2->column)
for (row = 1; row <= table1->rows; row++)
else if(str1 == null || str2 == null)
else
}} }
return true;
}/**@brief 列印兩個表的資訊
* @param[in] int is_show_content:是否需要顯示表的具體內容
* @param[in] const char *table_name:需要列印的表名稱
* @param[in] query_table *table 資料庫1的表
* @param[in] query_table *table1 資料庫2的表
* @param[out]
* @return
*/void print_table(int is_show_content, const char *table_name, query_table *table, query_table *table1)
printf("different table: \n", table_name);
if(is_show_content)
printf("\n");
} printf("\n");
for (row = 0; row <= table1->rows; row++)
printf("\n");
} printf("\n"); }}
/**@brief 提取表中的表名
* @param[in] char *p_database_table:表具體定義的字串
* @param[in] char *p_table_names:需要返回的表名稱
* @param[out] char *p_table_names:獲取到的表名稱
* @return 0:獲取成功
-1:獲取失敗
*/int parse_table_names(char *p_database_table, char *p_table_names)
p_tmp_str = strtok(input, table_start_str);
if(p_tmp_str)
return -1;
}/**@brief 獲取資料庫的版本
* @param[in] sqlite3 *db:開啟的資料庫
* @param[in] char *p_db_name:資料庫名稱
* @param[out]
* @return
*/void get_db_version(sqlite3 *db, char *p_db_name)
ret = db_query_open_v2(db, "db_version", &table);
printf("db name: version:\n", p_db_name, (table.data)[1]);
db_query_close_v2(&table);
}int main(int argc, char **argv);
if (argc < 3)
// 開啟兩個資料庫
// 開啟指定的資料庫檔案,如果不存在將建立乙個同名的資料庫檔案
ret = sqlite3_open(argv[1], &db1);
if (ret != sqlite_ok)
ret = sqlite3_open(argv[2], &db2);
if (ret != sqlite_ok)
get_db_version(db1, argv[1]);
get_db_version(db2, argv[2]);
/*是否需要顯示資料庫內容*/
if((argc == 4) &&memcmp(argv[3], "1", sizeof("1")) == 0)
table_num = sizeof(create_tables) / sizeof(char *);
// 分別讀取兩個資料庫的內容
for (i = 0; i < table_num; i++)
ret1 = db_query_open_v2(db1, table_names, &table1);
ret2 = db_query_open_v2(db2, table_names, &table2);
if (ret1 != ok || ret2 != ok)
/*比較如果兩個表不同的話則列印相應資訊*/
if (!compare_tables(&table1, &table2))
db_query_close_v2(&table1);
db_query_close_v2(&table2);
} sqlite3_close(db1);
sqlite3_close(db2);
return 0;
}
對比兩個資料庫表結構
在專案做好後實施了以後,可能因為需求等原因需要公升級,這時候一般都是在測試系統改好後在更新到正式系統.儲存過程,檢視等可以直接通過全部刪除在建立進行更新,但是表因為正式系統裡已有資料所以無法通過該方式進行更新.只能更改表結構,而這時有可能因為更改的表結構比較多,而出現有的表忘了更新.該程式可以對比兩...
SHELL 如何對比兩個資料庫差異?
今天一同事碰到這樣乙個問題 要比較兩個資料庫檔案的差異,資料量太大,乙個乙個看是不現實的,有什麼辦法更快一點呢?中午睡覺的時候,作了一些嘗試,終於想到乙個辦法。具體的辦法如下 二 用shell指令碼實現資料庫對比。如下 bin sh if ne2 then echo usage 0 db1 db2 ...
使用Liquibase對比兩個資料庫之間的差異
1.liquibase官網 2.支援所有主流資料庫 4.環境搭建 4.1 如果沒安裝j a,需要先安裝配置j a環境 4.2 解壓縮zip包,把解壓後的根目錄新增到環境變數 5.建立乙個新的目錄,放入以下三個檔案 5.1 mysql connector j a 8.0.17.jar 5.2 liqu...