2016-05-17 17 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;
文本 |整數|整數|實時|整數