From c6c114b18a95503fcced9f57323d9a92354611f6 Mon Sep 17 00:00:00 2001 From: "David J. Malan" <malan@harvard.edu> Date: Fri, 7 Jul 2017 20:19:44 -0400 Subject: [PATCH 1/4] removed requirement of space after SELECT et al. --- src/cs50/sql.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cs50/sql.py b/src/cs50/sql.py index 4cfbd78..03c6188 100644 --- a/src/cs50/sql.py +++ b/src/cs50/sql.py @@ -122,12 +122,12 @@ def process(value): self.logger.debug(statement) # if SELECT (or INSERT with RETURNING), return result set as list of dict objects - if re.search(r"^\s*SELECT\s+", statement, re.I): + if re.search(r"^\s*SELECT", statement, re.I): rows = result.fetchall() return [dict(row) for row in rows] # if INSERT, return primary key value for a newly inserted row - elif re.search(r"^\s*INSERT\s+", statement, re.I): + elif re.search(r"^\s*INSERT", statement, re.I): if self.engine.url.get_backend_name() in ["postgres", "postgresql"]: result = self.engine.execute(sqlalchemy.text("SELECT LASTVAL()")) return result.first()[0] @@ -135,7 +135,7 @@ def process(value): return result.lastrowid # if DELETE or UPDATE, return number of rows matched - elif re.search(r"^\s*(?:DELETE|UPDATE)\s+", statement, re.I): + elif re.search(r"^\s*(?:DELETE|UPDATE)", statement, re.I): return result.rowcount # if some other statement, return True unless exception From dc148b4ecf59e6aa78dcd162a1cccd9ae5b1cf57 Mon Sep 17 00:00:00 2001 From: "David J. Malan" <malan@harvard.edu> Date: Fri, 7 Jul 2017 21:33:21 -0400 Subject: [PATCH 2/4] coercing decimal.Decimal objects to float objects for PostgreSQL --- src/cs50/sql.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/cs50/sql.py b/src/cs50/sql.py index 03c6188..9966bbf 100644 --- a/src/cs50/sql.py +++ b/src/cs50/sql.py @@ -1,4 +1,5 @@ import datetime +import decimal import importlib import logging import re @@ -31,7 +32,6 @@ def execute(self, text, **params): """ Execute a SQL statement. """ - class UserDefinedType(sqlalchemy.TypeDecorator): """ Add support for expandable values, a la https://bitbucket.org/zzzeek/sqlalchemy/issues/3953/expanding-parameter. @@ -123,8 +123,14 @@ def process(value): # if SELECT (or INSERT with RETURNING), return result set as list of dict objects if re.search(r"^\s*SELECT", statement, re.I): - rows = result.fetchall() - return [dict(row) for row in rows] + + # coerce any decimal.Decimal objects to float objects + rows = [dict(row) for row in result.fetchall()] + for row in rows: + for column in row: + if isinstance(row[column], decimal.Decimal): + row[column] = float(row[column]) + return rows # if INSERT, return primary key value for a newly inserted row elif re.search(r"^\s*INSERT", statement, re.I): From 3d3fc0f8658197d5fc3cdb1589cfc21bfe40ee7d Mon Sep 17 00:00:00 2001 From: "David J. Malan" <malan@harvard.edu> Date: Fri, 7 Jul 2017 21:40:18 -0400 Subject: [PATCH 3/4] added citation --- src/cs50/sql.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cs50/sql.py b/src/cs50/sql.py index 9966bbf..4b54d97 100644 --- a/src/cs50/sql.py +++ b/src/cs50/sql.py @@ -125,6 +125,7 @@ def process(value): if re.search(r"^\s*SELECT", statement, re.I): # coerce any decimal.Decimal objects to float objects + # https://groups.google.com/d/msg/sqlalchemy/0qXMYJvq8SA/oqtvMD9Uw-kJ rows = [dict(row) for row in result.fetchall()] for row in rows: for column in row: From d9cad38337d6e85247484a42399e1785e4e88bee Mon Sep 17 00:00:00 2001 From: "David J. Malan" <malan@harvard.edu> Date: Sat, 8 Jul 2017 00:29:01 -0400 Subject: [PATCH 4/4] incremented version --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 8e6ee91..b4d078d 100644 --- a/setup.py +++ b/setup.py @@ -16,5 +16,5 @@ package_dir={"": "src"}, packages=["cs50"], url="https://github.com/cs50/python-cs50", - version="2.1.0" + version="2.1.1" )