是的,您可以按主键对数据进行排序,然后将数据写入 json 或 xml 文件。
然后你可以对这两个文件运行 diff。
您也可以按主键运行此分块,这样您就不必处理大文件。
记录任何不相等的差异。如果没有什么区别,您也可以在两个文件块上运行 MD5/SHA1,如果哈希匹配,则没有区别,如果没有,则有。
从使用 nhibernate 的经验来看,您需要注意的是:
- 位域
- text、ntext、varchar(MAX)、nvarchar(MAX) 字段
(顺便说一下,它们映射到没有长度的 varchar - 编码 UTF8)
- varbinary, varbinary(MAX), image (bytea[] vs. LOB)
- xml
- 在 pgsql 中插入所有数据后,所有主键的 id 串行生成器都会被重置。
要注意的另一件事是 CURRENT_TIMESTAMP 使用哪个时区。
注意:
我实际上是直接运行System.Data.DataRowComparer,而不将数据写入文件:
static void Main(string[] args)
{
DataTable dt1 = dt1();
DataTable dt2= dt2();
IEnumerable<DataRow> idr1 = dt1.Select();
IEnumerable<DataRow> idr2 = dt2.Select();
// MyDataRowComparer MyComparer = new MyDataRowComparer();
// IEnumerable<DataRow> Results = idr1.Except(idr2, MyComparer);
IEnumerable<DataRow> results = idr1.Except(idr2);
}
然后将所有不匹配的 DataRows 写入日志文件,为每个表一个目录(如果有差异)。
不过,不知道 Python 用什么来代替 System.Data.DataRowComparer。
由于这将是一项一次性任务,因此您也可以选择不在 Python 中执行此操作,而是使用 C#(参见上面的代码示例)。
此外,如果您有大型表,则可以使用具有顺序访问的 DataReader 进行比较。但是,如果以另一种方式削减它,则会大大减少所需的工作。