2016-05-17 38 views
0

我有一个将数据存储在sqlite数据库中的prog。在db中的其他表中,我创建了如下一个:SQlite将某些内容保存为Sci Notation

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)) 
+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如何使用列仿射做 类型转换时值被插入到一个表中。

CREATE TABLE T1( 吨TEXT, - 由规则2 NU NUMERIC文本亲和力, - 由规则5数字亲和力 我INTEGER, - 由规则1 řREAL整数亲和力, - 实规则4的亲和力 没有BLOB - 规则3没有亲和力;

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

INSERT INTO T1 VALUES('500.0', '500.0', '500.0', '500.0',“500。0' ); (t),typeof(nu),typeof(i),typeof(r),typeof(no)FROM t1;
文本 |整数|整数|实时|文

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

DELETE FROM t1;
插入t1值(500.0,500.0,500.0,500.0,500.0); (t),typeof(nu),typeof(i),typeof(r),typeof(no)FROM t1;
文本 |整数|整数|实时|真正

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

DELETE FROM t1;
插入t1值(,500,500,500,500); (t),typeof(nu),typeof(i),typeof(r),typeof(no)FROM t1;
文本 |整数|整数|实时|整数