Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions Pipfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
python-dotenv = "*"
psycopg2-binary = "*"
pandas = "*"
sqlalchemy = "*"
pymongo = "*"
dnspython = "*"

[dev-packages]

[requires]
python_version = "3.7"
238 changes: 238 additions & 0 deletions Pipfile.lock

Large diffs are not rendered by default.

20 changes: 20 additions & 0 deletions app/chinook_queries.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import os
import sqlite3

# construct a path to wherever your database exists
#DB_FILEPATH = "chinook.db"
DB_FILEPATH = os.path.join(os.path.dirname(__file__), "..", "data", "chinook.db")

connection = sqlite3.connect(DB_FILEPATH)
print("CONNECTION:", connection)

cursor = connection.cursor()
print("CURSOR", cursor)

query = "SELECT * FROM customers"

#result = cursor.execute(query)
#print("RESULT", result) #> returns cursor object w/o results (need to fetch the results)

result2 = cursor.execute(query).fetchall()
print("RESULT 2", result2)
Binary file added data/chinook.db
Binary file not shown.
Binary file not shown.
22 changes: 22 additions & 0 deletions module1-introduction-to-sql/buddymove_holidayiq_queries.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import os
import sqlite3
import pandas as pd

FILEPATH = os.path.join(os.path.dirname(__file__), 'buddymove_holidayiq.csv')
DB_FILEPATH = os.path.join(os.path.dirname(__file__), 'buddymove_holidayiq.sqlite3')

connection = sqlite3.connect(DB_FILEPATH)
cursor = connection.cursor()

# creat dataframe
df = pd.read_csv(FILEPATH)

df.to_sql('review', connection, if_exists='replace')

query = "SELECT COUNT('index') FROM review"
result = cursor.execute(query).fetchall()
print(f'Total number of rows is {result[0][0]}')

query = "SELECT COUNT('index') FROM review WHERE Nature>=100 and Shopping>=100"
result = cursor.execute(query).fetchall()
print(f'Number of people who reveiwed more that 100 Shopping and Nature: {result[0][0]}')
62 changes: 62 additions & 0 deletions module1-introduction-to-sql/rpg_queries.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import os
import sqlite3

DB_FILEPATE = os.path.join(os.path.dirname(__file__), 'rpg_db.sqlite3')

connection = sqlite3.connect(DB_FILEPATE)

cursor = connection.cursor()

# How many total Characters
query = 'SELECT count(DISTINCT character_id) FROM charactercreator_character'
result = cursor.execute(query).fetchall()
print('Number of total characters:', result[0][0], '\n')

# How many of each specific subclass?
clerics = 'SELECT count(DISTINCT character_ptr_id) as Number_of_Clerics FROM charactercreator_cleric'
fighters = 'SELECT count(DISTINCT character_ptr_id) as Number_of_Fighters FROM charactercreator_fighter'
mages = 'SELECT count(DISTINCT character_ptr_id) as Number_of_Mages FROM charactercreator_mage'
necromancers = 'SELECT count(DISTINCT mage_ptr_id) as Number_of_Necromancers FROM charactercreator_necromancer'
thieves = 'SELECT count(DISTINCT character_ptr_id) as Number_of_Theives FROM charactercreator_thief'
subclass = [clerics, fighters, mages, necromancers, thieves]
for x in subclass:
result = cursor.execute(x).fetchall()
print('Number of clerics, fighter, mages, necromancers, and thieves, respectively:', result[0][0])
print('\n')

# how many total items?
query = 'SELECT count(DISTINCT item_id) FROM armory_item'
item_result = cursor.execute(query).fetchall()
print(f'Total number of items: {item_result[0][0]}', '\n')

# How many of the items are wepons? How many are not?
query = 'SELECT count(DISTINCT item_ptr_id) FROM armory_weapon'
weapon_result = cursor.execute(query).fetchall()
num = weapon_result[0][0]
print(f'Number of weapons: {num}, Number of not weapons: {item_result[0][0] - num}', '\n')

# How many items does each character have? (first 20)
query = 'SELECT charactercreator_character.name, COUNT(charactercreator_character_inventory.item_id) as item_count FROM charactercreator_character_inventory JOIN charactercreator_character ON charactercreator_character_inventory.character_id = charactercreator_character.character_id GROUP BY name ORDER BY item_count DESC LIMIT 20'
result = cursor.execute(query).fetchall()
print('Top 20 characters with the most items:')
for i in range(0, len(result)):
print(f'{i+1}: {result[i][0]} has {result[i][1]} items')
print('\n')

# How many weapons does each character have? (first 20)
query = 'SELECT charactercreator_character.name, COUNT(charactercreator_character_inventory.item_id) as item_count FROM charactercreator_character_inventory JOIN charactercreator_character on charactercreator_character_inventory.character_id = charactercreator_character.character_id JOIN armory_weapon ON charactercreator_character_inventory.item_id = armory_weapon.item_ptr_id GROUP BY name ORDER BY item_count DESC LIMIT 20'
result = cursor.execute(query).fetchall()
print('Top 20 characters with the most weapons:')
for i in range(0, len(result)):
print(f'{i+1}: {result[i][0]} has {result[i][1]} weapons')
print('\n')

# On average, how many items does each Character have?
query = 'SELECT avg(item_count) FROM ( SELECT charactercreator_character.name, COUNT(charactercreator_character_inventory.item_id) as item_count FROM charactercreator_character_inventory LEFT JOIN charactercreator_character ON charactercreator_character_inventory.character_id = charactercreator_character.character_id GROUP BY name ORDER BY item_count DESC )subq'
result = cursor.execute(query).fetchall()
print(f'Average number of items per character is {result[0][0]:.3f}')

# On average, how many Weapons does each character have?
query = 'SELECT avg(item_count) FROM (SELECT charactercreator_character.name, COUNT(charactercreator_character_inventory.item_id) as item_count FROM charactercreator_character_inventory LEFT JOIN charactercreator_character on charactercreator_character_inventory.character_id = charactercreator_character.character_id JOIN armory_weapon ON charactercreator_character_inventory.item_id = armory_weapon.item_ptr_id GROUP BY name)subq'
result = cursor.execute(query).fetchall()
print(f'Average number of weapons per character is {result[0][0]:.3f}')
53 changes: 53 additions & 0 deletions module2-sql-for-analysis/elephant_queries.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import psycopg2
from psycopg2.extras import execute_values
import os
from dotenv import load_dotenv
import json

load_dotenv()
DB_NAME = os.getenv('DB_NAME')
DB_USER = os.getenv('DB_USER')
DB_PASSWORD = os.getenv('DB_PASSWORD')
DB_HOST = os.getenv('DB_HOST')

### Connect to ElephantSQL-hosted PostgreSQL
conn = psycopg2.connect(dbname=DB_NAME, user=DB_USER,
password=DB_PASSWORD, host=DB_HOST)
### A "cursor", a structure to iterate over db records to perform queries
cur = conn.cursor()
### An example query
cur.execute('SELECT * from test_table;')
### Note - nothing happened yet! We need to actually *fetch* from the cursor
result = cur.fetchall()
print(result)

print("---------------")
query = f'''
CREATE TABLE IF NOT EXISTS test_table2 (
id SERIAL PRIMARY KEY,
name varchar(40) NOT NULL,
data JSONB
);
'''
print('SQL:', query)
cur.execute(query)

my_dict = {'a':1, 'b':['dog','cat',42], 'c':'true'}

insertion_query = 'INSERT INTO test_table2 (name, data) VALUES %s'
execute_values( cur, insertion_query, [
('A rowwwww', 'null'),
('Another row with JSON', json.dumps(my_dict)),
('Third row', '3')
])



# cur.execute(insertion_query, ('A rowwwwww', 'null'))

# cur.execute(insertion_query, ('Another row, with JSONNNNN', json.dumps(my_dict)))

conn.commit()

cur.close()
conn.close()
37 changes: 37 additions & 0 deletions module2-sql-for-analysis/titanic.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import psycopg2
from psycopg2.extras import execute_values
import os
from dotenv import load_dotenv
import json
import pandas as pd
import sqlalchemy

load_dotenv()
DB_NAME = os.getenv('DB_NAME')
DB_USER = os.getenv('DB_USER')
DB_PASSWORD = os.getenv('DB_PASSWORD')
DB_HOST = os.getenv('DB_HOST')
DB_URL = os.getenv('DB_URL')


conn = psycopg2.connect(dbname=DB_NAME, user=DB_USER,
password=DB_PASSWORD, host=DB_HOST)

cur = conn.cursor()

# create the dataframe
path = os.path.join(os.path.dirname(__file__), 'titanic.csv')
df = pd.read_csv(path)

# creat table in database
engine = sqlalchemy.create_engine(DB_URL)

df.to_sql('titanic', con=engine, index=True, if_exists='replace')





conn.commit()
cur.close()
conn.close()
26 changes: 26 additions & 0 deletions module2-sql-for-analysis/titanic_queries.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import psycopg2
import os
from dotenv import load_dotenv
import json

load_dotenv()
DB_NAME = os.getenv('DB_NAME')
DB_USER = os.getenv('DB_USER')
DB_PASSWORD = os.getenv('DB_PASSWORD')
DB_HOST = os.getenv('DB_HOST')


conn = psycopg2.connect(dbname=DB_NAME, user=DB_USER,
password=DB_PASSWORD, host=DB_HOST)

cur = conn.cursor()

query = 'SELECT"Pclass", AVG("Age") FROM titanic GROUP BY"Pclass"'
cur.execute(query)
result = cur.fetchall()
print(result)

query = 'SELECT"Pclass", AVG("Fare") FROM titanic GROUP BY"Pclass"'
cur.execute(query)
result = cur.fetchall()
print(result)
57 changes: 57 additions & 0 deletions module3-nosql-and-document-oriented-databases/insert_rpg.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
'''
I think that relational databases are easier to work with. The biggest reason is because
it makes it a lot easier to follow visually. MongoDB was easier to use because the rules
seem to be a lot less strict on creating and inserting data. But I can also see that being a problem
too, so it's a little bit of a double egded sword.
'''

import os
import sqlite3
import pymongo
from dotenv import load_dotenv

DB_FILEPATE = os.path.join(os.path.dirname(__file__), '..', 'module1-introduction-to-sql', 'rpg_db.sqlite3')

connection = sqlite3.connect(DB_FILEPATE)

connection.row_factory = sqlite3.Row
cursor = connection.cursor()

#make dictionaries for each row in charactercreator_character
query = 'SELECT * FROM charactercreator_character'
cursor.execute(query)
result = cursor.fetchall()

character_rows = [dict(row) for row in result]

# make dict for each row in armory item
query = 'SELECT * FROM armory_item'
cursor.execute(query)
result = cursor.fetchall()
item_rows = [dict(row) for row in result]




load_dotenv()

DB_USER = os.getenv("MONGO_USER", default="OOPS")
DB_PASSWORD = os.getenv("MONGO_PASSWORD", default="OOPS")
CLUSTER_NAME = os.getenv("MONGO_CLUSTER_NAME", default="OOPS")

connection_uri = f"mongodb+srv://{DB_USER}:{DB_PASSWORD}@{CLUSTER_NAME}.mongodb.net/test?retryWrites=true&w=majority"

client = pymongo.MongoClient(connection_uri)

db = client.Module3_db

# insert characters into db
collection1 = db.characters
collection1.insert_many(character_rows)

# insert items into db
collection2 = db.items
collection2.insert_many(item_rows)



38 changes: 38 additions & 0 deletions module3-nosql-and-document-oriented-databases/mongo_queries.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import pymongo
import os
from dotenv import load_dotenv

load_dotenv()

DB_USER = os.getenv("MONGO_USER", default="OOPS")
DB_PASSWORD = os.getenv("MONGO_PASSWORD", default="OOPS")
CLUSTER_NAME = os.getenv("MONGO_CLUSTER_NAME", default="OOPS")

connection_uri = f"mongodb+srv://{DB_USER}:{DB_PASSWORD}@{CLUSTER_NAME}.mongodb.net/test?retryWrites=true&w=majority"
print("----------------")
print("URI:", connection_uri)

client = pymongo.MongoClient(connection_uri)
print("----------------")
print("CLIENT:", type(client), client)

db = client.Module3_db # "test_database" or whatever you want to call it
print("----------------")
print("DB:", type(db), db)

collection = db.pokemon # "pokemon_test" or whatever you want to call it
print("----------------")
print("COLLECTION:", type(collection), collection)

print("----------------")
print("COLLECTIONS:")
print(db.list_collection_names())

collection.insert_one({
"name": "Pikachu",
"level": 30,
"exp": 76000000000,
"hp": 400,
})
print("DOCS:", collection.count_documents({}))
print(collection.count_documents({"name": "Pikachu"}))
Loading