【发布时间】:2019-10-20 06:36:20
【问题描述】:
我在 MySQL 中有 2 个数据库:
1) 输入 Latitude-Longitude_dB ('latlong_db', 此后):它具有来自 GPS 跟踪设备的每个读数的纬度和经度。
2) Weather_db:我从 dB1 读取输入纬度,并计算每对纬度的“当前”天气数据(例如:湿度,cloud_coverage)。此天气数据被写入 Weather_db。
问题是:我需要跟踪最后读取的记录(哪个“输入 latlong”)。这样我就不会为我已经介绍过的纬度重新计算weather_data。如何跟踪上次读取的 input_latlong?
非常感谢。
编辑: 1)对于那些一直在询问“数据库v / s表”问题的人,答案是我正在从第一个数据库读取并写入第二个数据库。连接2个数据库的'config.json'如下:
{
"Tracker_ds_locallatlongdb": {
"database": "ds_testdb1",
"host": "XXXXXXXXXXX",
"port": XXXX,
"user": "XXXX",
"password": "XXXXX"
},
"Tracker_ds_localweatherdb": {
"database": "ds_testdb2",
"host": "XXXXXXX",
"port": XXXX,
"user": "XXXX",
"password": "XXXXX"
}
}
2) 我从input_latlong_db 读取并写入weather_db 的Python 脚本概述如下。我正在使用 OpenWeatherMap API 来计算给定纬度和经度的天气数据:
from pyowm import OWM
import json
import time
import pprint
import pandas as pd
import mysql.connector
from mysql.connector import Error
api_key = 'your api key'
def get_weather_data(my_lat, my_long):
owm= OWM(api_key)
obs= owm.weather_at_coords(my_lat.item() , my_long.item() ) #Use: <numpy.ndarray>.item:
w= obs.get_weather()
l= obs.get_location()
city= l.get_name()
cloud_coverage =w.get_clouds()
.
.
.
w_datatoinsert= [my_lat, my_long, w_latitude, w_longitude, city, weather_time_gmt,call_time_torontotime,
short_status, detailed_status,
temp_celsius, cloud_coverage, humidity, wind_deg, wind_speed,
snow, rain, atm_pressure, sea_level_pressure,sunset_time_gmt ] #15 + act_latitude + act_longitude
return w_datatoinsert
# ------------------------------------------------------------------------------------------------------------------------------------
spec_creds_1= {}
spec_creds_2= {}
def operation():
with open('C:/Users/config.json') as config_file:
creds_dict= json.load(config_file)
spec_creds_1= creds_dict['Tracker_ds_locallatlongdb']
spec_creds_2= creds_dict['Tracker_ds_localweatherdb']
try:
my_conn_1= mysql.connector.connect(**spec_creds_1 )
if (my_conn_1.is_connected()):
info_1= my_conn_1.get_server_info()
print("Connected ..now reading the local input_latlong_db: ", info_1)
try:
my_conn_2= mysql.connector.connect(**spec_creds_2)
if (my_conn_2.is_connected()):
info_2= my_conn_2.get_server_info()
print('Connected to write into the local weather_db: ', info_2)
cursor_2= my_conn_2.cursor()
readings_df= pd.read_sql("SELECT latitude, longitude FROM readings_table_19cols;", con= my_conn_1)
for index, row in readings_df.iterrows():
gwd= get_weather_data(row['latitude'], row['longitude'])
q= "INSERT INTO weather_table_19cols VALUES(" + ",".join(["%s"]*len(gwd)) + " ); "
cursor_2.execute(q, gwd)
my_conn_2.commit()
except Error as e:
print("Error while connecting to write into the local weather_db: ", e)
finally:
if (my_conn_2.is_connected()):
cursor_2.close()
my_conn_2.close()
print("Wrote 1 record to the local weather_db.")
except Error as e:
print("Error connecting to the local input latlong_db: ", e)
finally:
if (my_conn_1.is_connected()):
my_conn_1.close() # no cursor present for 'my_conn_1'
print("Finished reading all the input latlongs ...and finished inserting ALL the weather data.")
#-------------------------------------------------------------------------------
if __name__=="__main__":
operation()
【问题讨论】:
-
我想你有一个
database,还有两个tables。对吗? -
其实这些属于2个不同的数据库——
input_latlong是从1个数据库中读取的,而天气数据则完全写入不同的数据库。它来自不同的数据库。 -
您确定这不是两个表,也不是两个数据库吗?您能否分享有关如何更新
weather_db表的代码?当您在目标表weather_db中执行此update或insert时,听起来您只需要更新源表latitude_longitute_db上的新标志列。也许我误解了这个问题,因为它似乎对细节有点了解,因为正确的答案似乎是“您通过跟踪它们来跟踪 input_latlong 记录......” -
@JNevill:我希望问题中的编辑有所帮助。不过,我不得不承认——我不明白解决方案是否会大不相同,如果它们来自 2 个不同的数据库,而如果它们来自同一个数据库中的 2 个表?鉴于已编辑的问题,我怎么知道哪条记录是最后读取的 input_latlong ?
-
我认为在
readings_table_19cols中添加一个新列来表明它是否已被阅读将是一个很好的解决方案。提交INSERT INTO weather_table_19cols VALUES(...后,您可以提交"UPDATE readings_table_19cols SET new_col = 1 WHERE latitude ='" + row['latitude'] + "' AND longitude = '" + row['longitude'] + "';"或类似的内容。这样您就可以确定您已经阅读并更新了另一个表格。
标签: mysql mysql-workbench mysql-python