From f178538c0f150ccacb350decebad6899d1cecb33 Mon Sep 17 00:00:00 2001 From: solderq35 Date: Wed, 30 Aug 2023 17:21:58 -0700 Subject: [PATCH] probably forgot something huge but updated database instructions --- website/docs/adding_meters_buildings.md | 16 +++- website/docs/cloudwatch.md | 49 ++---------- website/docs/database.md | 101 ++++++++++++++++++++++++ website/docs/faq.md | 7 +- website/sidebars.js | 9 ++- website/static/img/erd.png | Bin 0 -> 31763 bytes 6 files changed, 135 insertions(+), 47 deletions(-) create mode 100644 website/docs/database.md create mode 100644 website/static/img/erd.png diff --git a/website/docs/adding_meters_buildings.md b/website/docs/adding_meters_buildings.md index 5f19c07..547e0d6 100644 --- a/website/docs/adding_meters_buildings.md +++ b/website/docs/adding_meters_buildings.md @@ -12,7 +12,7 @@ description: Checklist of tasks needed for adding new meters / buildings ::: -## Overview +## MySQL Workbench The following tables in the SQL database should be updated each time a new meter and/or building is added: @@ -27,6 +27,20 @@ The following tables in the SQL database should be updated each time a new meter - Match the corresponding meter group and meter ID together in. One meter group can be mapped to several meters, but not the other way around +- See [Database](database) document for help on updating / inserting buildings and meters + +## automated-jobs + - Also need to update [validIDs file in automated-jobs](https://github.com/OSU-Sustainability-Office/automated-jobs/blob/main/check-acq/validIDs.json) to reflect the added buildings, meters, meter groups - Needed to check if the newly added API endpoints are up at any given time. See [Cloudwatch](cloudwatch) for more info - Might integrate this better in the database at some point + +## AWS S3 + +- Go to AWS Web Console > S3 > Buckets > osu-energy-images +- Upload a picture of the newly added building (if applicable). Google images ought to be enough to find a good result +- Upload 1 picture to root directory of osu-energy-images +- Resize image for thumbnail with https://imageresizer.com/ + - Set width as **400px**, leave the height option blank to let the height scale with original proportions + - Upload resized images to `thumbnails` directory of osu-energy-images +- Go back and make sure the file name of the image you uploaded matches the image filename as listed in `buildings` table in the SQL database as seen in [MySQL Workbench](adding_meters_buildings#MySQL-Workbench) diff --git a/website/docs/cloudwatch.md b/website/docs/cloudwatch.md index 780fdb9..f759553 100644 --- a/website/docs/cloudwatch.md +++ b/website/docs/cloudwatch.md @@ -33,50 +33,11 @@ description: Overview of Cloudwatch and SNS Email Alerts - If you get a missed meter upload notification (TimeoutError) email or otherwise notice some missing or incorrect data for the Solar Panel buildings ([SEC Solar](https://dashboard.sustainability.oregonstate.edu/#/building/30/2) and [OSU Operations](https://dashboard.sustainability.oregonstate.edu/#/building/42/2)), then insert the missing data via MySQL workbench - - Check the `.env` file in the automated-jobs repo to reference where to log in for solar panel data. Clicking on one of the building names on the Plants page after you log in will bring up a table with daily and monthly data, including historical data + - Check the [`.env`](https://drive.google.com/file/d/12dCdA5E5e6qPgkSYehqOcX_zVy9YztFF/view?usp=sharing) file (must be OSU employee to see) for automated-jobs to reference where to log in for solar panel data. Clicking on one of the building names on the Plants page after you log in will bring up a table with daily and monthly data, including historical data - Most of the fields should be pretty self explanatory to insert into the Solar_Meters table in MySQL workbench, but for the time_seconds value, reference the playcode below for how to get the Unix timestamp -- INSERT (for missing data) and UPDATE (for fixing incorrect data etc) will be the most useful here as far as SQL commands -- Use basic precautions, make sure you have highlighted only the lines of SQL you want to run before running it (clicking the yellow lightning symbol in MySQL workbench) -- By default, MySQL workbench will forbid you from inserting, updating, or deleting multiple data entries without specifying an index range, so this should help prevent careless errors, but still, be careful! - - We don't have a dev database, so any changes in MySQL workbench hit production right away, so to speak. It can also be a good idea to back up data (e.g. as an Excel table, or at least taking some screenshots of what the database looked like) before performing any operation that could affect a lot of data entries -- It can be useful to sort by time_seconds (just click the column after running `SELECT * from Solar_Meters`) to keep track of the data entries in order, especially if you had to at some point retroactively insert missing data into the database +- Review the [database](database) document for general instructions / tips for how to insert or update etc. data to the Solar_Meters table -### Unix Timestamps - -- Useful reference / converter: https://www.unixtimestamp.com/index.php - - We are using millisecond precision for the webscrapers, to keep in mind for the Unix timestamps, your time_seconds values should have 10 digits -- Useful sandbox - [https://playcode.io/1457582](https://playcode.io/1457582) - -```js -const date = new Date('May 27, 2023 23:59:59 GMT+0'); - -// Calculate the Unix time in seconds -const unixTimeSeconds = Math.round(date.getTime() / 1000); - -console.log(unixTimeSeconds); -``` - -### SQL Command Examples - -**These are example commands below, please substitute the correct values as needed!** - -Again, refer to the [Unix Timestamps section above](webscraper_tutorial#unix-timestamps) for `time_seconds` value. - -Rest should be pretty self-explanatory. Remember that the `energy_change` value of `OSU_Operations_Total` = "OSU Operations" + "OSU Operations Lube Shop" in the portal website linked in the `.env` file - -For inserting missing data: - -`select * from Solar_Meters;` - -`` INSERT INTO Solar_Meters (`time`, `time_seconds`, `energy_change`, `tableid`) VALUES ('2023-7-02T23:59:59', 1688342399, 233.74, 'SEC_Solar'); `` - -`` INSERT INTO Solar_Meters (`time`, `time_seconds`, `energy_change`, `tableid`) VALUES ('2023-7-02T23:59:59', 1688342399, 2424.89, 'OSU_Operations_Total'); `` - -If you just need to update a value (example): - -``` -UPDATE Solar_Meters -SET time = '2023-7-2T23:59:59' -WHERE id IN (737, 738); -``` +- It can be useful to sort by `time_seconds` (just click the `time_seconds` column after running `SELECT * from Solar_Meters`) to keep track of the data entries in order, especially if you had to at some point retroactively insert missing data into the database +- Refer to [Database](database) document for more detailed instrutions on how to insert or update any missing data +- Rest should be pretty self-explanatory. Remember that the `energy_change` value of `OSU_Operations_Total` = `energy_change` of `OSU Operations` + `energy_change` of `OSU Operations Lube Shop` in the portal website linked in the [`.env`](https://drive.google.com/file/d/12dCdA5E5e6qPgkSYehqOcX_zVy9YztFF/view?usp=sharing) file diff --git a/website/docs/database.md b/website/docs/database.md new file mode 100644 index 0000000..e0d3ed5 --- /dev/null +++ b/website/docs/database.md @@ -0,0 +1,101 @@ +--- +title: Database +description: Deep Dive on MySQL Database +--- + +- **DO NOT** run any commands here blindly in the MySQL Workbench. Edit to fit your needs, checking you have set correct parameters + +## General Tips + +- For MySQL Workbench, I like using the commands: + - `SELECT` for viewing database tables + - `INSERT INTO` for adding elements + - `UPDATE` for editing tables + - `DELETE` for deleting table elements +- Remember for general syntax: + - Database or column etc names should use backticks (`/`) + - Actual values (the payload) should use single quote (`` ` ``) (if applicable, like if you have a string value. Numbers don't need the single quote for value) + - Example: `` INSERT INTO Solar_Meters (`time`, `time_seconds`, `energy_change`, `tableid`) VALUES ('2023-3-6T23:59:59', 1678175999999, 766.72, 'SEC_OSU_Op'); `` +- **WARNING**: Messing with the data in MySQL workbench **directly mutates the data** and I'm not sure about data backups. Use with care, although by default MySQL workbench should use "safe" settings + - Make sure you have highlighted only the lines of SQL you want to run before running it (clicking the yellow lightning symbol in MySQL workbench) + - Remember to specify the primary key value (e.g. add `WHERE ID = 5` to the query) for: + - `UPDATE` + - `DELETE` + - You don't have to specify the primary key (usually called `id`) for `INSERT INTO`, but it is good practice + - You can use a range for the primary key like `WHERE ID < 5` if you have to mass delete / insert / update something, but **do so with caution** +- We don't have a dev database, so any changes in MySQL workbench hit production right away, so to speak. It can also be a good idea to back up data (e.g. as an Excel table, or at least taking some screenshots of what the database looked like) before performing any operation that could affect a lot of data entries + +## Relationships between Tables + +Entity Relationship Diagram: +![Alt text](../static/img/erd.png) + +- Note that `buildings` table primary key `building_id` corresponds to `building_id_2` in `meter_groups` +- Each `meter_groups` value corresponds to several `meters` values via meter_group_relation as an interface table +- Each `buildings` value uses a `meter_groups` ID (primary key) value as a foreign key +- Each `campaigns` value corresponds to several `campaign_groups` values +- Each `campaign_groups` value corresponds to a `meter_groups` ID (primary key) value + +## More Specific SQL Instructions + +- Values surrounded by `<>` should be read as placeholder values in the SQL commands listed below + +### Inserting (Creating) + +1. `SELECT * from ` +2. `` INSERT INTO (
<`every column name you want in your table`>) VALUES () `` + - For this command, remember that the column names should be surrounded by backticks (`` ` ``) while **string** values should be surrounded by single quotes (`'`) + - Technically you can leave out the primary key for the column name / value. It will increment the primary key automatically in that case + +EXAMPLE (edit for your own needs): + +- `` INSERT INTO buildings (`id`,`map_id`,`image`,`group`,`name`,`hidden`) VALUES (43,'',NULL,'Solar','OSU Operations',0); `` + +### Selecting (Reading) + +` SELECT * from
` + +- See [Relationships between Tables](#relationships-between-tables) section above + +### Updating + +1. `SELECT * from
` +2. `UPDATE
SET = where = ;` + - For this command, **string** values should be surrounded by single quotes (`'`). The column names do not need backticks here. + +EXAMPLE (edit for your own needs): + +- `UPDATE campaign_groups SET group_id = 179 WHERE id = 53;` + +### Deleting + +1. `SELECT * from
` +2. `DELETE from
where = ;` + +EXAMPLE (edit for your own needs and DO NOT run this command unedited in MySQL: + +- `delete from meter_group_relation where id = 526;`) + +## Example SQL Commands File + +The below SQL Commands file is meant to serve as an example for correct syntax in case anything above is still not clear. + +- [Click Here for File](https://drive.google.com/file/d/1otAp6gcCr3qWLkSHZZJ4xBGOd4RxmjJ7/view?usp=drive_link) + - Must be OSU Sustainability paid employee to see above link + - Again, DO NOT run anything from here without editing to fit your needs. Make sure to highlight line by line in MySQL Workbench. Only highlight commands you intend to run + +## Unix Timestamps + +- Usually referred to as `time_seconds` value in data tables +- Useful reference / converter: https://www.unixtimestamp.com/index.php + - We are using millisecond precision for the webscrapers, to keep in mind for the Unix timestamps, your time_seconds values should have 10 digits +- Useful sandbox - [https://playcode.io/1457582](https://playcode.io/1457582) + +```js +const date = new Date('May 27, 2023 23:59:59 GMT+0'); + +// Calculate the Unix time in seconds +const unixTimeSeconds = Math.round(date.getTime() / 1000); + +console.log(unixTimeSeconds); +``` diff --git a/website/docs/faq.md b/website/docs/faq.md index 7a5d1b2..e882a36 100644 --- a/website/docs/faq.md +++ b/website/docs/faq.md @@ -42,4 +42,9 @@ Important AWS Services for OSU SO (non-exhaustive) - [Solar data missed upload](cloudwatch) - [Creating new Kilowatt Campaign](kilowatt_crackdown) - Anything else touching the database -- **WARNING**: Messing with the data in MySQL workbench **directly mutates the data** and I'm not sure about data backups. Use with care, although by default MySQL workbench should use "safe" settings, e.g. must specify primary key values for deleting values +- **See [Database document](database) for more detailed info** + +## Credentials + +- [Credentials Folder](https://drive.google.com/drive/u/1/folders/1geuKCp-aTIrde2WdJkE3f_L2TsF46_O3) + - Need to be OSU SO employee to see this link diff --git a/website/sidebars.js b/website/sidebars.js index d022265..23dddda 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -38,7 +38,14 @@ const sidebars = { slug: 'specific', }, - items: ['webscraper_tutorial', `energy_dashboard_graphs`, `lambda_common_layer`, `carbon_calculator`, 'kiosks'], + items: [ + 'database', + 'webscraper_tutorial', + `energy_dashboard_graphs`, + `lambda_common_layer`, + `carbon_calculator`, + 'kiosks', + ], }, { type: 'category', diff --git a/website/static/img/erd.png b/website/static/img/erd.png new file mode 100644 index 0000000000000000000000000000000000000000..c957444fc8d89bb6824d5df5b8669a3cd93a5717 GIT binary patch literal 31763 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 DK5=`m literal 0 HcmV?d00001