45 lines
1.5 KiB
Python
45 lines
1.5 KiB
Python
"""
|
|
Extracts the version of the PostgreSQL server.
|
|
"""
|
|
|
|
import re
|
|
|
|
# This reg-exp is intentionally fairly flexible here.
|
|
# Needs to be able to handle stuff like:
|
|
# PostgreSQL #.#.#
|
|
# EnterpriseDB #.#
|
|
# PostgreSQL #.# beta#
|
|
# PostgreSQL #.#beta#
|
|
VERSION_RE = re.compile(r'\S+ (\d+)\.(\d+)\.?(\d+)?')
|
|
|
|
|
|
def _parse_version(text):
|
|
"Internal parsing method. Factored out for testing purposes."
|
|
major, major2, minor = VERSION_RE.search(text).groups()
|
|
try:
|
|
return int(major) * 10000 + int(major2) * 100 + int(minor)
|
|
except (ValueError, TypeError):
|
|
return int(major) * 10000 + int(major2) * 100
|
|
|
|
|
|
def get_version(connection):
|
|
"""
|
|
Returns an integer representing the major, minor and revision number of the
|
|
server. Format is the one used for the return value of libpq
|
|
PQServerVersion()/``server_version`` connection attribute (available in
|
|
newer psycopg2 versions.)
|
|
|
|
For example, 90304 for 9.3.4. The last two digits will be 00 in the case of
|
|
releases (e.g., 90400 for 'PostgreSQL 9.4') or in the case of beta and
|
|
prereleases (e.g. 90100 for 'PostgreSQL 9.1beta2').
|
|
|
|
PQServerVersion()/``server_version`` doesn't execute a query so try that
|
|
first, then fallback to a ``SELECT version()`` query.
|
|
"""
|
|
if hasattr(connection, 'server_version'):
|
|
return connection.server_version
|
|
else:
|
|
with connection.cursor() as cursor:
|
|
cursor.execute("SELECT version()")
|
|
return _parse_version(cursor.fetchone()[0])
|