| 
					
				 | 
			
			
				@@ -32,7 +32,19 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "cell_type": "code", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "execution_count": 1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "metadata": {}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   "outputs": [], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   "outputs": [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     "ename": "DuplicateDatabase", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     "evalue": "database \"crime_db\" already exists\n", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     "output_type": "error", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     "traceback": [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      "\u001b[0;31mDuplicateDatabase\u001b[0m                         Traceback (most recent call last)", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      "\u001b[0;32m<ipython-input-1-cf6b3298b9db>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      5\u001b[0m \u001b[0mcur\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mconn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcursor\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      6\u001b[0m \u001b[0;31m# create the crime_db database\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m \u001b[0mcur\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexecute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"CREATE DATABASE crime_db;\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      8\u001b[0m \u001b[0mconn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mclose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      "\u001b[0;31mDuplicateDatabase\u001b[0m: database \"crime_db\" already exists\n" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     ] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   ], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "source": [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     "import psycopg2\n", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     "conn = psycopg2.connect(dbname=\"dq\", user=\"dq\")\n", 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -46,18 +58,18 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "cell_type": "code", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   "execution_count": 14, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   "execution_count": 2, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "metadata": {}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "outputs": [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     "ename": "NameError", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     "evalue": "name 'psycopg2' is not defined", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     "ename": "DuplicateSchema", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     "evalue": "schema \"crimes\" already exists\n", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      "output_type": "error", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      "traceback": [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      "\u001b[0;31mNameError\u001b[0m                                 Traceback (most recent call last)", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      "\u001b[0;32m<ipython-input-14-cf0881223d2f>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      1\u001b[0m \u001b[0;31m# now the crime_db database exists to we can connect to it\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mconn\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpsycopg2\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconnect\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdbname\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"crime_db\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0muser\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"dq\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      3\u001b[0m \u001b[0mconn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mautocommit\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      4\u001b[0m \u001b[0mcur\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mconn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcursor\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      5\u001b[0m \u001b[0;31m# create he crimes schema\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      "\u001b[0;31mNameError\u001b[0m: name 'psycopg2' is not defined" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      "\u001b[0;31mDuplicateSchema\u001b[0m                           Traceback (most recent call last)", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      "\u001b[0;32m<ipython-input-2-cf0881223d2f>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      4\u001b[0m \u001b[0mcur\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mconn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcursor\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      5\u001b[0m \u001b[0;31m# create he crimes schema\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0mcur\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexecute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"CREATE SCHEMA crimes;\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      "\u001b[0;31mDuplicateSchema\u001b[0m: schema \"crimes\" already exists\n" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      ] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    ], 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -81,7 +93,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "cell_type": "code", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   "execution_count": 4, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   "execution_count": 3, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "metadata": {}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "outputs": [], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "source": [ 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -105,7 +117,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "cell_type": "code", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   "execution_count": 12, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   "execution_count": 4, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "metadata": {}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "outputs": [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -149,7 +161,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "cell_type": "code", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   "execution_count": 9, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   "execution_count": 5, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "metadata": {}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "outputs": [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -166,7 +178,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "cell_type": "code", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   "execution_count": 8, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   "execution_count": 6, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "metadata": {}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "outputs": [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -202,7 +214,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "cell_type": "code", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   "execution_count": 10, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   "execution_count": 7, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "metadata": {}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "outputs": [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -258,18 +270,18 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "cell_type": "code", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   "execution_count": 5, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   "execution_count": 8, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "metadata": {}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "outputs": [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     "ename": "ProgrammingError", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     "ename": "DuplicateObject", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      "evalue": "type \"weekday\" already exists\n", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      "output_type": "error", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      "traceback": [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      "\u001b[0;31mProgrammingError\u001b[0m                          Traceback (most recent call last)", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      "\u001b[0;32m<ipython-input-5-f43f3cb51339>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      4\u001b[0m cur.execute(\"\"\"\n\u001b[1;32m      5\u001b[0m     \u001b[0mCREATE\u001b[0m \u001b[0mTYPE\u001b[0m \u001b[0mweekday\u001b[0m \u001b[0mAS\u001b[0m \u001b[0mENUM\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;34m'Monday'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'Tuesday'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'Wednesday'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'Thursday'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'Friday'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'Saturday'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'Sunday'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \"\"\")\n\u001b[0m\u001b[1;32m      7\u001b[0m \u001b[0;31m# create the table\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      8\u001b[0m cur.execute(\"\"\"\n", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      "\u001b[0;31mProgrammingError\u001b[0m: type \"weekday\" already exists\n" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      "\u001b[0;31mDuplicateObject\u001b[0m                           Traceback (most recent call last)", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      "\u001b[0;32m<ipython-input-8-c6d02a51c525>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      1\u001b[0m \u001b[0;31m# create the enumerated datatype for representing the weekday\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m cur.execute(\"\"\"\n\u001b[0m\u001b[1;32m      3\u001b[0m     \u001b[0mCREATE\u001b[0m \u001b[0mTYPE\u001b[0m \u001b[0mweekday\u001b[0m \u001b[0mAS\u001b[0m \u001b[0mENUM\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;34m'Monday'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'Tuesday'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'Wednesday'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'Thursday'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'Friday'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'Saturday'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'Sunday'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m;\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      4\u001b[0m \"\"\")\n\u001b[1;32m      5\u001b[0m \u001b[0;31m# create the table\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      "\u001b[0;31mDuplicateObject\u001b[0m: type \"weekday\" already exists\n" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      ] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    ], 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -303,18 +315,18 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "cell_type": "code", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   "execution_count": 13, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   "execution_count": 9, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "metadata": {}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "outputs": [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     "ename": "NameError", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     "evalue": "name 'psycopg2' is not defined", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     "ename": "UniqueViolation", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     "evalue": "duplicate key value violates unique constraint \"boston_crimes_pkey\"\nDETAIL:  Key (incident_number)=(1) already exists.\nCONTEXT:  COPY boston_crimes, line 2\n", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      "output_type": "error", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      "traceback": [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      "\u001b[0;31mNameError\u001b[0m                                 Traceback (most recent call last)", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      "\u001b[0;32m<ipython-input-13-0d8c83600488>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mconn\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpsycopg2\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconnect\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdbname\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"crime_db\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0muser\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"dq\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpassword\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"dq\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      2\u001b[0m \u001b[0mcur\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mconn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcursor\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      3\u001b[0m \u001b[0;31m# load the data from boston.csv into the table boston_crimes that is in the crimes schema\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      4\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"boston.csv\"\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      5\u001b[0m     \u001b[0mcur\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcopy_expert\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"COPY crimes.boston_crimes FROM STDIN WITH CSV HEADER\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      "\u001b[0;31mNameError\u001b[0m: name 'psycopg2' is not defined" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      "\u001b[0;31mUniqueViolation\u001b[0m                           Traceback (most recent call last)", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      "\u001b[0;32m<ipython-input-9-acb55cc3b2cf>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      1\u001b[0m \u001b[0;31m# load the data from boston.csv into the table boston_crimes that is in the crimes schema\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      2\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"boston.csv\"\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m     \u001b[0mcur\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcopy_expert\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"COPY crimes.boston_crimes FROM STDIN WITH CSV HEADER;\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      4\u001b[0m \u001b[0mcur\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexecute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"SELECT * FROM crimes.boston_crimes\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      5\u001b[0m \u001b[0;31m# print the number of rows to ensure that they were loaded\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      "\u001b[0;31mUniqueViolation\u001b[0m: duplicate key value violates unique constraint \"boston_crimes_pkey\"\nDETAIL:  Key (incident_number)=(1) already exists.\nCONTEXT:  COPY boston_crimes, line 2\n" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      ] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    ], 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -340,7 +352,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "cell_type": "code", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   "execution_count": 7, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   "execution_count": 10, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "metadata": {}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "outputs": [], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "source": [ 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -361,9 +373,21 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "cell_type": "code", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   "execution_count": 8, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   "execution_count": 11, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "metadata": {}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   "outputs": [], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   "outputs": [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     "ename": "DuplicateObject", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     "evalue": "role \"readonly\" already exists\n", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     "output_type": "error", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     "traceback": [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      "\u001b[0;31mDuplicateObject\u001b[0m                           Traceback (most recent call last)", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      "\u001b[0;32m<ipython-input-11-aac7a30d6e63>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mcur\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexecute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"CREATE GROUP readonly NOLOGIN;\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      2\u001b[0m \u001b[0mcur\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexecute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"GRANT CONNECT ON DATABASE crime_db TO readonly;\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      3\u001b[0m \u001b[0mcur\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexecute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"GRANT USAGE ON SCHEMA crimes TO readonly;\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      4\u001b[0m \u001b[0mcur\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexecute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"GRANT SELECT ON ALL TABLES IN SCHEMA crimes TO readonly;\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      "\u001b[0;31mDuplicateObject\u001b[0m: role \"readonly\" already exists\n" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     ] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   ], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "source": [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     "cur.execute(\"CREATE GROUP readonly NOLOGIN;\")\n", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     "cur.execute(\"GRANT CONNECT ON DATABASE crime_db TO readonly;\")\n", 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -384,9 +408,21 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "cell_type": "code", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   "execution_count": 9, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   "execution_count": 12, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "metadata": {}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   "outputs": [], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   "outputs": [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     "ename": "DuplicateObject", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     "evalue": "role \"readwrite\" already exists\n", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     "output_type": "error", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     "traceback": [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      "\u001b[0;31mDuplicateObject\u001b[0m                           Traceback (most recent call last)", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      "\u001b[0;32m<ipython-input-12-0e862a604f07>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mcur\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexecute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"CREATE GROUP readwrite NOLOGIN;\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      2\u001b[0m \u001b[0mcur\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexecute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"GRANT CONNECT ON DATABASE crime_db TO readwrite;\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      3\u001b[0m \u001b[0mcur\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexecute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"GRANT USAGE ON SCHEMA crimes TO readwrite;\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      4\u001b[0m \u001b[0mcur\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexecute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA crimes TO readwrite;\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      "\u001b[0;31mDuplicateObject\u001b[0m: role \"readwrite\" already exists\n" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     ] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   ], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "source": [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     "cur.execute(\"CREATE GROUP readwrite NOLOGIN;\")\n", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     "cur.execute(\"GRANT CONNECT ON DATABASE crime_db TO readwrite;\")\n", 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -407,9 +443,21 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "cell_type": "code", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   "execution_count": 10, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   "execution_count": 13, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "metadata": {}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   "outputs": [], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   "outputs": [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     "ename": "DuplicateObject", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     "evalue": "role \"data_analyst\" already exists\n", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     "output_type": "error", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     "traceback": [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      "\u001b[0;31mDuplicateObject\u001b[0m                           Traceback (most recent call last)", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      "\u001b[0;32m<ipython-input-13-87c28bfb320b>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mcur\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexecute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"CREATE USER data_analyst WITH PASSWORD 'secret1';\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      2\u001b[0m \u001b[0mcur\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexecute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"GRANT readonly TO data_analyst;\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      4\u001b[0m \u001b[0mcur\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexecute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"CREATE USER data_scientist WITH PASSWORD 'secret2';\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      5\u001b[0m \u001b[0mcur\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexecute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"GRANT readwrite TO data_scientist;\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      "\u001b[0;31mDuplicateObject\u001b[0m: role \"data_analyst\" already exists\n" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     ] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   ], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "source": [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     "cur.execute(\"CREATE USER data_analyst WITH PASSWORD 'secret1';\")\n", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     "cur.execute(\"GRANT readonly TO data_analyst;\")\n", 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -439,7 +487,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "cell_type": "code", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   "execution_count": 11, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   "execution_count": 14, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "metadata": {}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "outputs": [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -501,7 +549,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "name": "python", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "nbconvert_exporter": "python", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "pygments_lexer": "ipython3", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   "version": "3.7.3" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   "version": "3.8.2" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  "nbformat": 4, 
			 |