繁体   English   中英

如何从另一个bigquery响应将值插入mysql表

[英]how to insert values into mysql table from another bigquery response

我的Python程序连接到BigQuery并获取要插入MySQL表的数据。 它已成功从BigQuery提取结果。 它也已成功连接到MySQL DB,但未插入数据。 我看到它为该row[1]抱怨row[1]

将BigQuery响应中的值插入MySQL表列的正确方法是什么?

query_data = {mybigquery}

query_response = query_request.query(projectId='myprojectid',body=query_data).execute()

for row in query_response['rows']:
  cursor.execute ("INSERT INTO database.table VALUES ('row[0]','row[1]','row[2]','row[3]','row[4]');")

另外,我尝试使用

cursor.execute ("INSERT INTO database.table VALUES (%s,%s,%s,%s,%s);")

要么

cursor.execute ("INSERT INTO database.table VALUES (row[0],row[1],row[2],row[3],row[4]);")

但是总之在mysql表中插入值时失败

字符串文字

关于原始问题,问题在于引用变量。 这使execute函数将它们视为字符串文字,而不是从它们中获取值。

正如@Herman所建议的,要使用我认为您想要的值正确执行SQL语句,您将需要以下类似内容:

query_data = {mybigquery}
statement = 'INSERT INTO database.table VALUE (%s, %s, %s);'

response = query_request.query(projectId='myprojectid', body=query_data).execute()
rows = response['rows']
for row in rows:
  values = (row[0], row[1], row[2])
  cursor.execute(statement, values)


BigQuery查询JSON

但是请记住,以上代码无法立即使用,因为上面代码中的row与从BigQuery Job:query API收到的响应不符。

在此API中, rowsrow对象的数组。 每个row对象都有一个属性f ,它是一个字段数组。 最后,每个field都有一个属性v ,它是该字段的值。

要获取连续第二个字段的值,您应该使用row['f'][1]['v'] 由于您需要使用tuplelist作为cursor.execute()方法的params参数的list ,因此可以使用列表理解功能获取字段值的列表,如下所示:

for row in rows:
  values = [field['v'] for field in row['f]]


在插入之前清理值

一旦正确读取字段值,您将得到TypeError ,因为executestr无法将值正确转换为字符串。 BigQuery和MySQL之间的重大区别之一是BigQuery中的值可以是具有多个自身值的记录 为了确保正确插入此值,您必须在插入值之前自行清理这些值。 如果该值为listdict ,则必须以类似于str方法的某种方式进行序列化才能将其存储在MySQL中。


def sanitize(value):
  if type(value) is list:
    return str(value)
  if type(value) is dict:
    return str(value)
  # this may be required for other types
  return value

data = {mybigquery}
statement = 'INSERT INTO database.table VALUE (%s, %s, %s);'

response = request.query(projectId='projid', body=data).execute()
for row in response['rows']:
  values = [sanitize(field['v']) for field in row['f']]
  cursor.execute(statement, values)

这是非常基本的卫生条件。 您应该真正验证所有字段值,并确保将它们正确转换为MySQL类型,而不是简单地插入值数组。

错误消息是什么? 应该是这样的:

cursor.execute(“将数据库插入表值(%s,%s,%s,%s,%s)”,第[0:5]行)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM