我正在制作用于监控三个不同系统之间文件移动的Web应用程序,每个系统都会生成一个格式如下的日志文件:
Folder, Filename, DataTime, Filesize
要求是确定System1
生成的文件是否已成功转移到3rd System
。并且还要确定失败点。
我正在使用SQLite
数据库,因为我必须保存7天的失败文件信息。
数据库设计:
Folder, Filename, DateTime, FileSize, FileSource
FileSource
可以是System1
,System2
,System3
。
这样我可以进行批量插入,但会减慢识别失败文件的速度,任何人都可以帮我编写好的SQL来识别失败的文件。
例如:样本数据
folder1, file1, 2012-29-08 23:01:02, 10, S1
folder1, file1, 2012-29-08 23:03:02, 10, S2
上述ex数据表示在S2到S3之间,folder1 / file1传输失败。
注意:每天将传输超过10,000个文件。
答案 0 :(得分:0)
我不确定你能从这里到达那里。您可能最好从实际执行传输的程序中记录错误代码。
你现在的桌子有一些问题。
CREATE TABLE filelog (
folder text,
filename text,
datatime timestamp,
filesize integer,
filesource text);
-- Your failed transfer . . .
INSERT INTO "filelog" VALUES('folder1','file1','2012-08-29 23:01:02',10,'S1');
INSERT INTO "filelog" VALUES('folder1','file1','2012-08-29 23:03:02',10,'S2');
-- . . . and a duplicate of it.
INSERT INTO "filelog" VALUES('folder1','file1','2012-08-29 23:01:02',10,'S1');
INSERT INTO "filelog" VALUES('folder1','file1','2012-08-29 23:03:02',10,'S2');
替换我的表名,您的查询是
select folder, filename, count()
from filelog group by folder, filename having count() < 3;
使用上面的数据,即使有两个失败,您的查询也不会返回任何行。 (或者一个失败的两个副本。)修复它的第一步是声明一个可防御的主键。
CREATE TABLE filelog (
folder text,
filename text,
datatime timestamp,
filesize integer,
filesource text,
primary key (folder, filename, datatime)
);
主键约束将阻止您两次输入单个传输。它允许您每天多次传输同一个文件,这在第一次传输失败时可能有意义。
-- Your failed transfer . . .
INSERT INTO "filelog" VALUES('folder1','file1','2012-08-29 23:01:02',10,'S1');
INSERT INTO "filelog" VALUES('folder1','file1','2012-08-29 23:03:02',10,'S2');
-- . . . and an earlier transfer that also failed.
INSERT INTO "filelog" VALUES('folder1','file1','2012-08-23 23:01:02',10,'S1');
INSERT INTO "filelog" VALUES('folder1','file1','2012-08-23 23:03:02',10,'S2');
您的查询将再次返回任何行。我们需要更好地定义成功和失败的转移。
成功的转移似乎具有这些特征。
和*大,麻烦的特征。 。
单个文件传输的所有三行必须属于单个“批处理”(缺少更好的单词)。这意味着我们不能让查询组将下面的前两行(传输失败)与下面的最后一行(成功传输的一部分)放在一起,即使时间戳顺序正确,传输的字节也是正确的
folder1 file1 2012-08-29 23:01:02 10 S1
folder1 file1 2012-08-29 23:03:02 10 S2
folder1 file1 2012-08-29 23:45:02 10 S1
folder1 file1 2012-08-29 23:48:02 10 S2
folder1 file1 2012-08-29 23:53:02 10 S3
会有点复杂。我可能完全误解了您成功转移的标准。
(您可能会为“datatime”列提供更好的名称。)
答案 1 :(得分:0)
你完全误解了我的情景
CREATE TABLE filelog (
folder text,
filename text,
transferTime timestamp,
filesize integer, -- what time the transfer occurs at this filesource
filesource text,
primary key (folder, filename, filesource)
);
每个来源都会生成一个日志文件,其中包含他们传输或处理的文件。
案例: 如果在S1的日志文件中找到并且在S2的日志文件中缺少file1.txt,则这意味着S1和&之间的传输失败。 S2。
如果在S1和S2日志文件中找到file1.txt而在S3中没有发现日志文件传输失败S3或S3没有处理该文件。
通过此查询,我可以找到在S2或S3错过的文件:
select folder, filename, filesource, count(*)
from filelog
group by folder, filename, filesource
having count() < 3;
在回复你的同时我得到了答案,如果计数为1,这意味着在S1&amp; S3, 或者如果count为2,则表示在S2和S3之间传输失败。
感谢您的回复。 @catcall