diff --git a/.gitignore b/.gitignore
index 38da6d9d19382a882083f11e5392e50cb36fb031..98feee92f790f8537a788150b9b993f2db938bfe 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,3 @@
 __pycache__/
 .vscode/
+database.db
diff --git a/database.py b/database.py
new file mode 100644
index 0000000000000000000000000000000000000000..80ca1c68bdcbcf975ff4f765120d2f2cc4c57244
--- /dev/null
+++ b/database.py
@@ -0,0 +1,100 @@
+import os
+import sqlite3
+from typing import List
+
+DATABASE = os.path.join(os.path.dirname(os.path.abspath(__file__)), "database.db")
+
+class Connection:
+	def __init__(self):
+		self.connection = sqlite3.connect(DATABASE)
+		self.cursor = self.connection.cursor()
+		self.do_rollback = False
+
+	def commit(self):
+		self.connection.commit()
+		self.do_rollback = False
+
+	def execute(self, sql: str, tuple = ()):
+		self.do_rollback = True
+		self.cursor.execute(sql, tuple)
+
+	def fetch_all(self):
+		return self.cursor.fetchall()
+
+	def close(self):
+		if self.do_rollback:
+			self.connection.rollback()
+
+		self.connection.close()
+
+	def __enter__(self):
+		return self
+
+	def __exit__(self, *args):
+		self.close()
+
+with Connection() as conn:
+	conn.execute('''CREATE TABLE IF NOT EXISTS Workspaces (
+		id integer NOT NULL PRIMARY KEY AUTOINCREMENT,
+		name text NOT NULL,
+		address text NOT NULL,
+		main_photo text NOT NULL,
+		description text NOT NULL,
+		website text NOT NULL,
+		email text NOT NULL,
+		phone_number text NOT NULL,
+		opening_hours text,
+		checkin_instructions text)''')
+	conn.execute('''CREATE TABLE IF NOT EXISTS AdditionalPhotos (
+		id integer NOT NULL PRIMARY KEY AUTOINCREMENT,
+		url text NOT NULL,
+		workspace_id integer NOT NULL,
+		FOREIGN KEY (workspace_id) REFERENCES Workspaces(id))''')
+	conn.commit()
+
+class Workspace:
+	def __init__(self, name: str,
+		address: str, main_photo: str, additional_photos: List[str], description: str,
+		website: str, email: str, phone_number: str, opening_hours: str, checkin_instructions: str):
+		self.id = None
+		self.name = name
+		self.address = address
+		self.main_photo = main_photo
+		self.additional_photos = additional_photos
+		self.description = description
+		self.website = website
+		self.email = email
+		self.phone_number = phone_number
+		self.opening_hours = opening_hours
+		self.checkin_instructions = checkin_instructions
+
+	def from_query(conn, tuple):
+		(id, name, address, main_photo, description, website, email, phone_number, opening_hours, checkin_instructions) = tuple
+		additional_photos = []
+		
+		conn.execute("SELECT url FROM AdditionalPhotos WHERE workspace_id = ?", ("1"))
+		for x in conn.cursor.fetchall():
+			additional_photos.append(x[0])
+
+		workspace = Workspace(name, address, main_photo, additional_photos, description, website, email, phone_number, opening_hours, checkin_instructions)
+		workspace.id = id
+		return workspace
+
+def add_workspace(workspace: Workspace):
+	with Connection() as conn:
+		conn.execute(
+			"INSERT INTO Workspaces (name, address, main_photo, description, website, email, phone_number, opening_hours, checkin_instructions) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)",
+			(workspace.name, workspace.address, workspace.main_photo, workspace.description, workspace.website, workspace.email, workspace.phone_number, workspace.opening_hours, workspace.checkin_instructions)
+		)
+		id = conn.cursor.lastrowid
+		for url in workspace.additional_photos:
+			conn.execute("INSERT INTO AdditionalPhotos (url, workspace_id) VALUES (?, ?)", (url, id))
+		conn.commit()
+		return id
+
+def get_workspaces():
+	with Connection() as conn:
+		conn.execute("SELECT * FROM Workspaces")
+		return [Workspace.from_query(conn, x) for x in conn.cursor.fetchall()]
+
+print(get_workspaces())
\ No newline at end of file
diff --git a/import_database.py b/import_database.py
new file mode 100644
index 0000000000000000000000000000000000000000..deceed40a826f436a7db3a2546563523db90b263
--- /dev/null
+++ b/import_database.py
@@ -0,0 +1,14 @@
+import database
+
+print(database.add_workspace(database.Workspace(
+	"CodeBase",
+	"CodeBase Edinburgh, 37a Castle Terrace, Edinburgh, EH1 2EL",
+	"https://images.squarespace-cdn.com/content/v1/55439320e4b0f92b5d6c4c8b/1505921023376-PAHUDHVOOKIYF4XQPHOO/5951229048_3e3d50fcb1_o.jpg?format=750w",
+	["https://images.squarespace-cdn.com/content/v1/55439320e4b0f92b5d6c4c8b/1636387943314-W9JWMS6ZX4DEZSPUV7T0/Copy+of+Unfiltered_square+%281%29.png?format=500w"],
+	"We've been exploring the world of startups...",
+	"https://www.thisiscodebase.com",
+	"hannah@thisiscodebase.com",
+	"+44 131 560 2003",
+	"Monday - Friday, 9am - 5pm",
+	"Tramsched members should contact Hannah using the email address listed."
+)))