これは行政上の問題でした。問題が別のコードの別の場所にあり、インポートしたものを更新できる場合、それは私たちのせいであり、コードが壊れていると主張されました。ですから、これは問題ありません。
ディクショナリにある値をまとめて追加し、それらを変数に格納してから、NDB データストアに追加します。
基本的に、csv をインポートしてデータを解析しています。2 つの値の合計が 1,000.00 より大きい場合、浮動小数点数は千の値に変更されます。
例:
- 1263.13 は 1 に変わります
- 51367.42 は 51 に変わります
- 218.12 は変更されません (218.12)
データの保存に問題があると考えていますが、問題の再現に問題があり、少量のデータで「誤検知」が発生することを確認しています。IE: 問題はありません。
blob からの csv の読み取り:
blob_reader = blobstore.BlobReader(blob_info.key())
raw_blob = blob_reader.read()
result = [row for row in csv.DictReader(StringIO.StringIO(raw_blob), delimiter=',')]
# loop through all rows in the data/csv
for v, row in enumerate(result):
if set_data_type(row, v) == False:
return False
else:
length = len(result) + 1
# check values for type
if check_values(row, v, length) == False:
return False
else:
# calculate numerical data for storage
calculate_vars(row, v)
if not error_log:
# if no errors, store the row in the datastore
store_data(row, v)
# if there are no errors, add to transaction log.
if not error_log:
added_records = len(result)
old_new = "Upload Success - " + str(added_records) + " records added."
transactions(module, 'Datastore', data[0], 'CSV Bulk Upload', old_new, old_new)
値の計算:
def calculate_vars(row, v):
# calcuate values for storage based on
# data passed from the csv
try:
float_sum = float(row['float1']) + float(row['float2'])
except Exception, e:
catch_error(["Value calculation error in row ", v+1, " Error: ", e])
return False
else:
# global var
calculated_val = float_sum
保存値:
def store_data(row, v):
try:
entry = Datastore(
float_sum = calculated_val
)
except Exception, e:
catch_error(["StoreDataError in row ", v, e])
return False
else:
# add entry to datastore.
entry.put()
データストア列 'float_sum' は ndb.FloatProperty() です
私たちが理解しようとしているのは、数値が 1,000 を超える場合に浮動小数点数が千桁に切り捨てられる原因は何なのかということです。明らかに、2 つの float を一緒に追加しても通常はこの問題が発生しないことはわかっています。そのため、データストア自体に問題がある可能性があると考えています。