![](/img/trans.png)
[英]How to insert into table with values from another tables - mysql inner join
[英]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)
但是请记住,以上代码无法立即使用,因为上面代码中的row
与从BigQuery Job:query API收到的响应不符。
在此API中, rows
是row
对象的数组。 每个row
对象都有一个属性f
,它是一个字段数组。 最后,每个field
都有一个属性v
,它是该字段的值。
要获取连续第二个字段的值,您应该使用row['f'][1]['v']
。 由于您需要使用tuple
或list
作为cursor.execute()
方法的params
参数的list
,因此可以使用列表理解功能获取字段值的列表,如下所示:
for row in rows:
values = [field['v'] for field in row['f]]
一旦正确读取字段值,您将得到TypeError
,因为execute
或str
无法将值正确转换为字符串。 BigQuery和MySQL之间的重大区别之一是BigQuery中的值可以是具有多个自身值的记录 。 为了确保正确插入此值,您必须在插入值之前自行清理这些值。 如果该值为list
或dict
,则必须以类似于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.