当前位置:  开发笔记 > 编程语言 > 正文

使用Git合并的SQLite表

如何解决《使用Git合并的SQLite表》经验,为你挑选了3个好方法。

我有一个存储在SQLite数据库中的日志文件,我想在git存储库中分发.

稍后我想将日志文件的更改自动与原始文件合并.

这会起作用吗?将自动二进制文件合并到SQLite文件中会更频繁地爆炸吗?



1> smoofra..:

您需要在git config中定义自定义合并和差异驱动程序,然后使用属性将它们与文件相关联.

这只是在转储上进行简单的文本合并,因此它可以很好地产生完全无意义.你绝对需要检查它的工作以确保它做正确的事情 它应该从简单的合并中解脱.

在你的.git/config中:

[merge "sqlite3"]
    name = sqlite3 merge driver
    driver = merge-sqlite3 %O %A %B

[diff "sqlite3"]   
    name = sqlite3 diff driver  
    command = diff-sqlite3 

在.gitattributes中:

signons.sqlite diff=sqlite3 merge=sqlite3

在你的路径的某个地方,名为diff-sqlite3

#!/usr/bin/perl -w

use File::Temp  qw/ :POSIX /;
use IPC::Run qw/run/ ;

@ARGV == 7 or die sprintf 'wtf %s', join(' ', @ARGV);

my ($name, $x, $y) = ($ARGV[0], $ARGV[1], $ARGV[4]);

my ($a, $b);

eval { 
  $a = tmpnam();
  $b = tmpnam();

  run ['sqlite3', $x, '.dump'], '>', $a or die 'sqlite3 failed';
  run ['sqlite3', $y, '.dump'], '>', $b or die 'sqlite3 failed';

  print "diff-sqlite3 a/$name b/$name\n";
  run ['diff', '-u', $a, $b, '--label', "a/$name", '--label', "b/$name"], '>', \*STDOUT;   

  unlink $a;
  unlink $b; 
  1;
} or do {
  unlink $a if defined $a;
  unlink $b if defined $b;
  die $@; 
}

也在你的路径中,命名为merge-sqlite3

#!/usr/bin/perl -w

use File::Temp  qw/ :POSIX /;
use IPC::Run qw/run/ ;

@ARGV == 3 or die sprintf 'wtf %s', join(' ', @ARGV);

my ($o, $a, $b) = @ARGV; 

print "MERGEING SQLITE FILES $o $a $b\n"; 


eval { 
  $ad = tmpnam();
  $bd = tmpnam();
  $od = tmpnam(); 

  run ['sqlite3', $o, '.dump'], '>', $od or die 'sqlite3 failed';
  run ['sqlite3', $a, '.dump'], '>', $ad or die 'sqlite3 failed';
  run ['sqlite3', $b, '.dump'], '>', $bd or die 'sqlite3 failed';

  run ['merge', $ad, $od, $bd] or do {
    my $newname = "$a.dump";
    my $n = 0;
    while (-e $newname) {
      ++$n;
      $newname = "$a.dump.$n";
    }
    print "merge failed, saving dump in $newname\n";
    rename $ad, $newname;
    undef $ad; 
    die 'merge failed';
  };

  unlink $a or die $!;
  my $err; 
  run ['sqlite3', $a], '>', \*STDOUT, '2>', \$err, '<', $ad;
  if ('' ne $err) {
    print STDERR $err;
    die 'sqlite3 failed';
  }  

  unlink $ad if defined $ad;
  unlink $bd; 
  unlink $od;
  1;
} or do {
  unlink $ad if defined $ad;
  unlink $bd if defined $bd;
  unlink $od if defined $od;

  die $@; 
}

我现在就把它们搞砸了,现在你可能不得不解决这些问题.

请参阅:http://git-scm.com/docs/gitattributes和http://git-scm.com/docs/git-config



2> CB Bailey..:

我不相信git真的是你工作的工具.git是一个分布式源代码管理工具,而不是数据库复制工具.

git将尝试的唯一自动合并是合并文本文件.日志文件(通常)是一个文本文件,为什么不直接将它放入git而不是先放入数据库?



3> polyglot..:

我怀疑任何通用版本控制系统(git,svn,cvs等)都能以你描述的方式处理数据库.如果你坚持使用git来合并数据库,最好的办法是将数据库转换为文本文件,合并文本文件,然后重新创建数据库.例如,

sqlite3 .dump > dump_file.txt

可以创建重新创建数据库所需的所有sql语句,然后你对转储文件做东西,然后创建一个sqlite数据库

sqlite3 newdatabase.db < modified_dump_file.txt

你应该能够使用某种git hook自动化它(我不太熟悉git).

推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有