兩個資料庫檔案對比

2021-07-02 06:27:13 字數 4127 閱讀 4904

如下圖所示,函式首先開啟兩個資料庫,然後獲取兩個資料庫的版本資訊。根據資料庫各個表名稱來開啟相應的表,然後判斷兩個表的具體內容是否相同,如果不同的話則列印出該表名,如果使用者選擇列印具體內容的話,則分別列印兩個表的具體內容(由於表的內容可能會比較多,且檢視單個表內容的話使用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...