SQlite将某些内容保存为Sci表示法

时间:2016-05-17 15:38:42

标签: python-2.7 sqlite

我有一个用于在sqlite db中存储数据的prog。在db中的其他表中,我创建了一个如下:

 conn.execute("CREATE TABLE {tn} ({cn} {ct})".format(tn=test, cn="STEP_NAME", ct="TEXT"))

其中,表创建了几列。一个是:

conn.execute("ALTER TABLE {tn} ADD COLUMN '{cn}' {ct} ".format(tn=test, cn=value, ct="TEXT"))

我试图将数据保存到它,但它的行为方式我无法解释。当我保存270113185308874890时,召回时会显示270113185308874890。但是,当我保存89014103258771944209时,它保存为8.90141032588e + 19。

我该怎样防止这种情况?我尝试过不同的列类型而没有运气,真的不明白它为什么要转换它。

编辑:

我用来存储它的代码

def store_result(conn, table_name, row_name, data):
    for k, v in data.iteritems():
        if isinstance(v, str):
            data[k] = v.replace('"', "'").rstrip(' \t\r\n\0')
    keys = data.keys()
    vals = data.values()
    # add test name column for everything but info call
    if table_name != "info":
        keys.insert(0, "STEP_NAME")
        vals.insert(0, str(row_name))
    # Make pretty for sqlite3 and its crazy param rules.
    sql_keys = ','.join(str(v) for v in keys)
    sql_vals = ','.join(str(v) for v in [x if str.isdigit(str(x)) else '"{}"'.format(x) for x in vals])
    # try to write or tell me why not.
    try:
        conn.execute("""INSERT into {table}({sql_keys}) values ({vals})""".format(table=table_name,
                                                                                  sql_keys=sql_keys,
                                                                                  vals=sql_vals))
        conn.commit()
    except Exception as e:
        logging.warn("DB ERROR:{}_{}_{}".format(e, table_name, row_name))

1 个答案:

答案 0 :(得分:0)

从表格返回后打印值时,保存值的变量类型会影响它们的打印方式和精确度。举个例子:

int1 = 270113185308874890;
float1 = 270113185308874890.0;

int2 = 89014103258771944209;
float2 = 89014103258771944209.0;

print 'int1  : ' + str(int1);
print 'float1: ' + str(float1);

print '';

print 'int2  : ' + str(int2);
print 'float2: ' + str(float2);

将打印:

int1  : 270113185308874890
float1: 2.70113185309e+17

int2  : 89014103258771944209
float2: 8.90141032588e+19

似乎在SQLite表中类型为TEXT,如下面SQLite网站(https://www.sqlite.org/datatype3.html)中的示例所示。您应该使用typeof()函数来确保您将数据存储为TEXT。

最后,如果你的所有数字都是整数,你应该考虑在你的SQLite表中使用INTEGER类型而不是TEXT。此外,如果您使用TEXT尝试保持精度,请确保您不受调用代码的限制。即除非你正在处理Decimal Python类型,否则REAL SQLite类型将匹配Float Python类型的精度。

  

2.3列亲和行为示例

     

以下SQL演示了SQLite如何使用列关联进行操作   将值插入表中时键入转换。

     

创建表t1(        t TEXT , - 规则2的文字亲和力       nu NUMERIC, - 规则5的数字亲和力       i INTEGER, - 规则1的整数亲和力       r REAL, - 规则4的真正亲和力       没有BLOB - 规则3没有亲和力;

     

- 存储为 TEXT ,INTEGER,INTEGER,REAL,TEXT的值。

     
    

插入t1值(' 500.0' ,' 500.0',' 500.0',' 500.0 ',' 500.0');
    SELECT typeof(t),typeof(nu),typeof(i),typeof(r),typeof(no)FROM t1;
    的文本 |整数|整数|真实|文本

  
     

- 存储为 TEXT ,INTEGER,INTEGER,REAL,REAL的值。

     
    

从t1删除;
    插入t1值( 500.0 ,500.0,500.0,500.0,500.0);     SELECT typeof(t),typeof(nu),typeof(i),typeof(r),typeof(no)FROM t1;
    的文本 |整数|整数|真实|实

  
     

- 存储为 TEXT ,INTEGER,INTEGER,REAL,INTEGER的值。

     
    

从t1删除;
    插入t1值( 500 ,500,500,500,500);
    SELECT typeof(t),typeof(nu),typeof(i),typeof(r),typeof(no)FROM t1;
    的文本 |整数|整数|实|整数