我有一个用于在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))
答案 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;
的文本强> |整数|整数|实|整数