Skip to content

Commit 180de75

Browse files
IlyaSukhanovhaotianw465
authored andcommitted
In psycopg2 connect accept database name either as dbname or database (#91)
1 parent bfae5db commit 180de75

File tree

2 files changed

+35
-6
lines changed

2 files changed

+35
-6
lines changed

aws_xray_sdk/ext/psycopg2/patch.py

+9-6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import re
22
import wrapt
3+
from operator import methodcaller
34

45
from aws_xray_sdk.ext.dbapi2 import XRayTracedConn
56

@@ -16,14 +17,16 @@ def patch():
1617
def _xray_traced_connect(wrapped, instance, args, kwargs):
1718

1819
conn = wrapped(*args, **kwargs)
19-
host = kwargs['host'] if 'host' in kwargs else re.search(r'host=(\S+)\b', args[0]).groups()[0]
20-
dbname = kwargs['dbname'] if 'dbname' in kwargs else re.search(r'dbname=(\S+)\b', args[0]).groups()[0]
21-
port = kwargs['port'] if 'port' in kwargs else re.search(r'port=(\S+)\b', args[0]).groups()[0]
22-
user = kwargs['user'] if 'user' in kwargs else re.search(r'user=(\S+)\b', args[0]).groups()[0]
20+
parameterized_dsn = { c[0]: c[-1] for c in map(methodcaller('split', '='), conn.dsn.split(' '))}
2321
meta = {
2422
'database_type': 'PostgreSQL',
25-
'url': 'postgresql://{}@{}:{}/{}'.format(user, host, port, dbname),
26-
'user': user,
23+
'url': 'postgresql://{}@{}:{}/{}'.format(
24+
parameterized_dsn.get('user', 'unknown'),
25+
parameterized_dsn.get('host', 'unknown'),
26+
parameterized_dsn.get('port', 'unknown'),
27+
parameterized_dsn.get('dbname', 'unknown'),
28+
),
29+
'user': parameterized_dsn.get('user', 'unknown'),
2730
'database_version': str(conn.server_version),
2831
'driver_version': 'Psycopg 2'
2932
}

tests/ext/psycopg2/test_psycopg2.py

+26
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,32 @@ def test_execute_dsn_kwargs():
4747
assert sql['database_version']
4848

4949

50+
def test_execute_dsn_kwargs_alt_dbname():
51+
"""
52+
Psycopg supports database to be passed as `database` or `dbname`
53+
"""
54+
q = 'SELECT 1'
55+
56+
with testing.postgresql.Postgresql() as postgresql:
57+
url = postgresql.url()
58+
dsn = postgresql.dsn()
59+
conn = psycopg2.connect(database=dsn['database'],
60+
user=dsn['user'],
61+
password='',
62+
host=dsn['host'],
63+
port=dsn['port'])
64+
cur = conn.cursor()
65+
cur.execute(q)
66+
67+
subsegment = xray_recorder.current_segment().subsegments[0]
68+
assert subsegment.name == 'execute'
69+
sql = subsegment.sql
70+
assert sql['database_type'] == 'PostgreSQL'
71+
assert sql['user'] == dsn['user']
72+
assert sql['url'] == url
73+
assert sql['database_version']
74+
75+
5076
def test_execute_dsn_string():
5177
q = 'SELECT 1'
5278
with testing.postgresql.Postgresql() as postgresql:

0 commit comments

Comments
 (0)