使用python将数据插入mysql表

Posted

技术标签:

【中文标题】使用python将数据插入mysql表【英文标题】:insert data into mysql table using python 【发布时间】:2021-08-22 01:28:50 【问题描述】:

我是 python 语言的初学者,我试图使用 python 将我的 json 文件数据插入到我的数据库表中,但问题是我没有错误:

推文号 49634 正在上传到服务器

我不知道问题出在哪里,如果有任何帮助,我将不胜感激

import mysql.connector
import json

mydb = mysql.connector.connect(host='localhost', port='3306', user='root', password='nihad147', database='tweets')
mycursor = mydb.cursor()
sql_request='insert ignore into tweet_location (latitude, longitude, tweet_id) values (%s,%s,%s)'""

myJsonFile = open('tweet.json', encoding="utf-8")
c = 0



for line in myJsonFile:
  c = c + 1
print("tweet number ", c, " is uploading to the server")
data = json.loads(line)
#line = line.replace('','')

tweet = "SELECT * FROM tweet WHERE tweet_id = '" + str(data['tweet_id']) + "'"
mycursor.execute(tweet)

myresult = mycursor.fetchall()

row_count = mycursor.rowcount
if row_count == 0:
 if 'location' in data.keys() and data['location'] != None and 'address' in data['location']:
  latitude = data ['location']['lat']
  longitude=data ['location']['lon']


mycursor.execute(sql_request, (latitude,longitude,data['tweet_id']))
print ('------------')


mydb.commit ()

这是我的 json 文件数据的示例:

"tweet_id":"1261276320878788609",
"date":"Fri May 15 12:44:42 +0000 2020",
"raw_text":"برنامج وطني لدعم المبدعين في مواجهة #كورو"
"geo_source":"user_location",
"location":"address":
"country":"Tunisia","country_code":"tn","state_district":"غزالة","county":"العرب","state":"Bizerte",
"response":
"'place_id': 235309103, 'licence': 'Data © OpenStreetMap contributors, ODbL 1.0. https://osm.org/copyright', 'osm_type': 'relation', 'osm_id': 7124228, 'boundingbox': ['37.105957', '37.2033466', '9.4739053', '9.6124953'], 'lat': '37.1551868', 'lon': '9.54834183807249', 'display_name': 'العرب, غزالة, Bizerte, Tunisia', 'class': 'boundary', 'type': 'administrative', 'importance': 0.45, 'icon': '/data/nominatimimages/mapicons/poi_boundary_administrative.p.20.png','address':'county': 'العرب', 'state_district': 'غزالة', 'state': 'Bizerte', 'country': 'Tunisia', 'country_code': 'tn'",
"geohash":"snwg37buskzd","query_term":"arab","lon":9.54834183807249,"lat":37.1551868,
"user_friends_count":61,"user_description":"I love UAE and his great leadership",
"user_created_at":"Wed Oct 09 11:41:41 +0000 2013",
"user_screen_name":"SikandarMirani",
"user_id_str":"706377881",
"user_verified":false,
"user_statuses_count":50804,
"user_followers_count":946,
"user_location":"Dubai United Arab Emirates"

这是我的表的属性推文: 推文ID, id_user, 文本, 推文位置, created_at, 名称屏幕, 类别 ID,

【问题讨论】:

请使用正确的 4 空格缩进,只有 1 个空格很难阅读代码。 为什么在 tweet 表中找不到推文 ID 时,您只能从 JSON 中获取 location 【参考方案1】:

不要一次一行地读取 JSON 文件。使用json.load() 将整个文件加载到字典中。

在选择推文的查询中使用一个参数,而不是将data['tweet_id'] 连接到 SQL 中。

插入新行的代码应位于从数据中设置latitudelongitude 的所有if 语句中。事实上,你不妨把所有数据库代码放在if 语句中,检查location 是否设置在JSON 中。

import mysql.connector
import json

mydb = mysql.connector.connect(host='localhost', port='3306', user='root', password='nihad147', database='tweets')
mycursor = mydb.cursor()
sql_request='insert ignore into tweet_location (latitude, longitude, tweet_id) values (%s,%s,%s)'""

with open('tweet.json', encoding="utf-8") as myJsonFile:
    data = json.load(myJsonFile)

if data.get('location') and 'address' in data['location']:
    tweet = "SELECT 1 FROM tweet WHERE tweet_id = %s"
    mycursor.execute(tweet, (data['tweet_id'],))
    myresult = mycursor.fetchall()

    row_count = len(myresult)
    if row_count == 0:
        print(f"Inserting data['tweet_id'] to the database");
        latitude = data['location']['lat']
        longitude = data['location']['lon']
        mycursor.execute(sql_request, (latitude,longitude,data['tweet_id']))
        mydb.commit ()
        print ('------------')
    else:
        print(f"Tweet data['tweet_id'] is already in the database")

【讨论】:

以上是关于使用python将数据插入mysql表的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 executemany 将 Python 中的字典列表插入 MySQL

在python中使用mysql连接器插入数据

使用mysql连接器python将值插入数据库,网络抓取

将数千条记录插入表中的最有效方法是啥(MySQL,Python,Django)

使用 JDBC 将引用另一个表的数据插入 MySQL

VB6 - 将数据从 mySQL 表插入访问表