Skip to content

Commit 1ddb329

Browse files
committed
improve version string parsing for Postgres
1 parent c15c7ad commit 1ddb329

File tree

2 files changed

+46
-4
lines changed

2 files changed

+46
-4
lines changed

piccolo/engine/postgres.py

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,19 @@ def __init__(self, config: t.Dict[str, t.Any]) -> None:
227227
)
228228
super().__init__()
229229

230+
def _parse_raw_version_string(self, version_string: str) -> float:
231+
"""
232+
The format of the version string isn't always consistent. Sometimes
233+
it's just the version number e.g. '9.6.18', and sometimes
234+
it contains specific build information e.g.
235+
'12.4 (Ubuntu 12.4-0ubuntu0.20.04.1)'. Just extract the major and
236+
minor version numbers.
237+
"""
238+
version_segment = version_string.split(" ")[0]
239+
major, minor = version_segment.split(".")[:2]
240+
version = float(f"{major}.{minor}")
241+
return version
242+
230243
def get_version(self) -> float:
231244
"""
232245
Returns the version of Postgres being run.
@@ -248,10 +261,10 @@ def get_version(self) -> float:
248261
print(exception)
249262
return 0.0
250263
else:
251-
server_version = response[0]["server_version"]
252-
major, minor = server_version.split(".")[:2]
253-
version = float(f"{major}.{minor}")
254-
return version
264+
version_string = response[0]["server_version"]
265+
return self._parse_raw_version_string(
266+
version_string=version_string
267+
)
255268

256269
def prep_database(self):
257270
loop = asyncio.new_event_loop()
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
from unittest import TestCase
2+
3+
from piccolo.engine.postgres import PostgresEngine
4+
from ..base import postgres_only
5+
6+
7+
@postgres_only
8+
class TestVersionParsing(TestCase):
9+
def test_version_parsing(self):
10+
"""
11+
Make sure the version number can correctly be parsed from a range
12+
of known formats.
13+
"""
14+
engine = PostgresEngine(config={})
15+
16+
self.assertEqual(
17+
engine._parse_raw_version_string(version_string="9.4"), 9.4
18+
)
19+
20+
self.assertEqual(
21+
engine._parse_raw_version_string(version_string="9.4.1"), 9.4
22+
)
23+
24+
self.assertEqual(
25+
engine._parse_raw_version_string(
26+
version_string="12.4 (Ubuntu 12.4-0ubuntu0.20.04.1)"
27+
),
28+
12.4,
29+
)

0 commit comments

Comments
 (0)