Skip to content

Commit 0c45fc8

Browse files
authored
Merge pull request piccolo-orm#34 from piccolo-orm/boolean_fixes
fixing bug with boolean column defaults
2 parents 5d7a468 + abc0f37 commit 0c45fc8

File tree

4 files changed

+46
-2
lines changed

4 files changed

+46
-2
lines changed

piccolo/apps/playground/commands/run.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
from piccolo.table import Table
1111
from piccolo.columns import (
12+
Boolean,
1213
Varchar,
1314
ForeignKey,
1415
Integer,
@@ -51,6 +52,7 @@ class Ticket(Table):
5152

5253
class DiscountCode(Table):
5354
code = UUID()
55+
active = Boolean(default=True, null=True)
5456

5557

5658
TABLES = (Manager, Band, Venue, Concert, Ticket, DiscountCode)

piccolo/engine/sqlite.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,12 +96,21 @@ def convert_seconds_out(value: bytes) -> datetime.timedelta:
9696
return datetime.timedelta(seconds=float(value.decode("utf8")))
9797

9898

99+
def convert_boolean_out(value: bytes) -> bool:
100+
"""
101+
If the value is from a boolean column, convert it to a bool value.
102+
"""
103+
_value = value.decode("utf8")
104+
return _value == "1"
105+
106+
99107
sqlite3.register_converter("Numeric", convert_numeric_out)
100108
sqlite3.register_converter("Integer", convert_int_out)
101109
sqlite3.register_converter("UUID", convert_uuid_out)
102110
sqlite3.register_converter("Date", convert_date_out)
103111
sqlite3.register_converter("Time", convert_time_out)
104112
sqlite3.register_converter("Seconds", convert_seconds_out)
113+
sqlite3.register_converter("Boolean", convert_boolean_out)
105114

106115
sqlite3.register_adapter(Decimal, convert_numeric_in)
107116
sqlite3.register_adapter(uuid.UUID, convert_uuid_in)

piccolo/table.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -245,8 +245,8 @@ def __init__(self, ignore_missing: bool = False, **kwargs):
245245
Assigns any default column values to the class.
246246
"""
247247
for column in self._meta.columns:
248-
value = kwargs.pop(column._meta.name, None)
249-
if not value:
248+
value = kwargs.pop(column._meta.name, ...)
249+
if value is ...:
250250
value = column.get_default_value()
251251

252252
if isinstance(value, Default):

tests/columns/test_boolean.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
from unittest import TestCase
2+
3+
from piccolo.table import Table
4+
from piccolo.columns.column_types import Boolean
5+
6+
7+
class MyTable(Table):
8+
boolean = Boolean(boolean=False, null=True)
9+
10+
11+
class TestBoolean(TestCase):
12+
def setUp(self):
13+
MyTable.create_table().run_sync()
14+
15+
def tearDown(self):
16+
MyTable.alter().drop_table().run_sync()
17+
18+
def test_return_type(self):
19+
for value in (True, False, None, ...):
20+
kwargs = {} if value is ... else {"boolean": value}
21+
expected = MyTable.boolean.default if value is ... else value
22+
23+
row = MyTable(**kwargs)
24+
row.save().run_sync()
25+
self.assertEqual(row.boolean, expected)
26+
27+
self.assertEqual(
28+
MyTable.select(MyTable.boolean)
29+
.where(MyTable.id == row.id)
30+
.first()
31+
.run_sync()["boolean"],
32+
expected,
33+
)

0 commit comments

Comments
 (0)