时间:2017-08-15 11:28:25

标签: python-3.x sqlite formatting

我已经在研究这个问题,但所有的结果只是命名sqlite的.width函数,或者参考pragma和类似的来找出隐藏的值。 问题是:我有一个数据库,我在" .mode列"和" .headers on"下以各种方式查询。所有列宽度的规则似乎都是10,或列的标题长度,具体取决于哪个更大。(..即使没有显示标题也是如此) 现在,数据库中现在约2个表中的一些列具有更长的列宽,因此它们完全匹配数据的长度(...而不是标题)。

例如,我有一个" date"显然只有4个符号的列,因此列宽应默认为10,而是扩展为15以适合长日期代码,如" 636363515212222"。 所以我想,也许长整数也会扩展这个,但是在另一个例子中,我得到了" uuid"仅使用文本字符串作为数据,最多可达34个字符。

注意,在基本上每个其他有文本或大整数(我测试过)的例子中,数据的输出都会被截断以适应列宽,例如

SomeLongNames .............. "Herbert Wate

我还尝试将其中一个长的uuid条目复制到另一个表中,只是为了查看宽度是否会因某种原因自动适应这种形式的输入。它没有,并且uuid被截断了。 因此,这里留下的唯一结论是表格本身包含一些列的自定义格式,但我完全无法找到它们。 我试过了:

  • "架构(表)"确实给出了create table语句,但没有任何其他格式的迹象。

  • " pragma table_info(table_name)"它列出了类型,但没有varchar(任何地方!)或其他东西可以解释任何效果。

  • "从sqlite_master"中选择*做其他人的混合,但不再包含。

  • " .WIDTH"如果我无法通过上述命令找到该信息,则不会为某些表提供仅为某些表指定列宽的选项。

现在我的问题是:这是怎么回事?不知何故,这些表必须像这样结束。可能它们是在其他sql类型中创建的?(我只是在分析数据库以学习python编程访问) 但是,即使在这种情况下,sqlite也必须知道,所以在所有这些中必须有某种格式指针。 ......但是在哪里?

我非常需要这个btw。在进行远程sql-queries时使python输出看起来一致。除了没有触及那些便宜的特定列之外,没办法解决这个问题。

1 个答案:

答案 0 :(得分:0)

数据库中没有存储格式信息。

sqlite3命令行shell尝试使用以下代码自动检测列名称和第一行值的列宽:

    for(i=0; i<nArg; i++){
      int w, n;
      if( i<ArraySize(p->colWidth) ){
        w = colWidth[i];
      }else{
        w = 0;
      }
      if( w==0 ){
        w = strlenChar(azCol[i] ? azCol[i] : "");
        if( w<10 ) w = 10;
        n = strlenChar(azArg && azArg[i] ? azArg[i] : p->nullValue);
        if( w<n ) w = n;
      }
      if( i<ArraySize(p->actualWidth) ){
        p->actualWidth[i] = w;
      }
      if( showHdr ){
        utf8_width_print(p->out, w, azCol[i]);
        utf8_printf(p->out, "%s", i==nArg-1 ? rowSep : "  ");
      }
    }
    if( showHdr ){
      for(i=0; i<nArg; i++){
        int w;
        if( i<ArraySize(p->actualWidth) ){
           w = p->actualWidth[i];
           if( w<0 ) w = -w;
        }else{
           w = 10;
        }
        utf8_printf(p->out,"%-*.*s%s",w,w,
               "----------------------------------------------------------"
               "----------------------------------------------------------",
                i==nArg-1 ? rowSep : "  ");
      }
    }