【问题标题】:Keep track of the last read record in MySQL跟踪 MySQL 中的最后读取记录
【发布时间】: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 中执行此updateinsert 时,听起来您只需要更新源表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


【解决方案1】:
  1. 在 Input_latlong_table-readings_table_19cols 中:我创建了一个 Autoincremented readings_id 作为主键,以及一个名为 read_flag 的列,其默认值为 0。

  2. weather_table_19cols 中:我创建了一个自动递增的weather_id 作为主键。

  3. 由于我的方法涉及读取输入的经纬度记录并将其天气数据相应地写入weather_table,因此我比较了readings_table_19colsweather_table_19cols 的索引。如果它们匹配,则意味着输入记录已被读取,我会将 read_flag 设置为 1。

..

for index_1, row_1 in readings_df_1.iterrows():

                            gwd= get_weather_data(row_1['imei'], row_1['reading_id'] ,row_1['send_time'],row_1['latitude'], row_1['longitude'])

                            q_2= "INSERT INTO weather_table_23cols(my_imei, my_reading_id, actual_latitude, actual_longitude, w_latitude, w_longitude, city, weather_time_gmt, OBD_send_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) VALUES("  +  ",".join(["%s"]*len(gwd))     +    " ); "

                            q_1b= "UPDATE ds_testdb1.readings_table_22cols re,  ds_testdb2.weather_table_23cols we \
                             SET re.read_flag=1 WHERE (re.reading_id= we.weather_id);"  # use the prefix 'db_name.table_name' if 1 cursor is being used for 2 different db's

                            cursor_2.execute(q_2, gwd)
                            my_conn_2.commit()
                            cursor_1.execute(q_1b) # use Cursor_1 for 1st query 
                            my_conn_1.commit()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多