Created
May 23, 2021 18:31
-
-
Save andrewmatte/ab59bd9f35d4081b6349a410dcc463ea to your computer and use it in GitHub Desktop.
Got an API that you want to scrape into a SQL database? Check out this utility that accepts JSON and its type/name, prompts to you tell it which is the ID key, and creates types also for array-valued keys in a similar way. It could be extended to create table-creation statements in SQL.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import json | |
def add_table(name, json, exclude=None): | |
non_array_columns = [key for key in json if not isinstance( | |
json[key], list) and key != exclude] | |
id_column = prompt_for_selection(non_array_columns, name) | |
non_array_columns = [x for x in non_array_columns if x != id_column] | |
array_values = [key for key in json if isinstance( | |
json[key], list) and key != id_column and key != exclude] | |
global tables | |
tables.append({ | |
'name': name, | |
'id_column': id_column, | |
'columns': non_array_columns, | |
}) | |
for array_value in array_values: | |
tmp = json[array_value][0] | |
tmp[name] = json[id_column] | |
print('\nlooking now at', array_value) | |
add_table(array_value, tmp, name) | |
def prompt_for_selection(options, name): | |
if len(options) == 1: | |
return options[0] | |
print('what is the ID column for', name, "?") | |
c = 0 | |
for option in options: | |
print(c, option) | |
c += 1 | |
option_id = input("type a number from the options: ") | |
try: | |
answer = int(option_id) | |
assert answer >= 0 | |
assert answer < len(options) | |
return options[answer] | |
except: | |
print('invalid option... try again or quit') | |
return prompt_for_selection(options, name) | |
if __name__ == '__main__': | |
tables = [] | |
while True: | |
again = input('...got any json? y/n ').lower() | |
if again == 'y': | |
data = input('paste it now and hit enter. ') | |
name = input('tell me the name of this json: ') | |
try: | |
ready = json.loads(data) | |
add_table(name, ready) | |
except Exception as e: | |
print(e) | |
print('it did not parse. Try again?') | |
else: | |
answer = input("what to see a demo? (y/n) ") | |
if answer == 'y': | |
data = {"key1":1, "id":2,"transactions":[{"eh":3, "txId": 4}]} | |
print("LOOK AT THISSS", data) | |
print("we'll call it 'purchase'") | |
name = 'purchase' | |
add_table(name, data) | |
break | |
print(tables) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment