我有一个包含4列的大查询表:name(字符串),age(int),score(float),dob(datetime)。
quickSort(arr, 1, 5)
print(arr)
以上是测试我是否可以插入空值的示例。例如。我实际上计算得分和出生日期(假设)并插入它。但是如果计算不起作用,我想在大查询表中插入null,因为datetime支持null。
默认情况下,python中的null为None。但是我无法将其插入到因为我无法将Nonetype连接为字符串。 如果我尝试将null语句字符串化为:
#!/usr/bin/env python
import json
from google.cloud import bigquery
def stream_data(json_data):
bigquery_client = bigquery.Client("myproject")
dataset = bigquery_client.dataset("ComputedData")
table = dataset.table("test")
data = json.loads(json_data)
table.reload()
rows = [data]
errors = table.insert_data(rows)
if not errors:
print('Loaded 1 row ')
else:
print('Errors: {}'.format(errors))
if __name__ == '__main__':
mynam = 'mike'
mage = 212
mydob='1983-09-01 00:00:00'
mydob=None
ds=str(mydob) if mydob else None
myscore = 0;
stream_data('["' + str(mynam) + '",' + str(mage) + ',"' + ds + '",'+ str(myscore) +']')
我得到'无效的日期时间字符串" null"'
我不确定我是否以错误的方式生成了json。 enter image description here
我确实得到了空值,但为此我必须省略json中的字段。
ds=str(mydob) if mydob else 'null'
我不能这样做,好像我想输入分数,但如果我插入
,则将dob保留为null stream_data('["' + str(mynam) + '",' + str(mage) + ']')
这会在日期时间列中插入或尝试插入分数。所以我必须为json中的每一列插入一个值。但希望能够在插入时指定空值。
答案 0 :(得分:0)
这里的问题可能是insert_data
方法使用元组列表而不是json。
我刚刚在BQ中创建了一个像你一样的表,并使用了与你相同的代码,但我没有转换为json,而是使用docs中描述的函数,如下所示:
error = table.insert_data([('name1', 200, None, '1990-09-09 00:00:00'),
('name2', 201, 67.3,)])
在我做的测试中,我也尝试过:
error = table.insert_data([('name3', 301, 35.4,None)])
还有:
error = table.insert_data([(None, None, None,None)])
这一切都奏效了:
也许您可以做的是(如果您的代码由于某种原因接收到json)首先将此json转换为元组列表,然后将此列表发送到insert_data
方法,并使用NULL
值为None
。