4
4
import asyncpg
5
5
from sqlalchemy .engine .interfaces import Dialect
6
6
from sqlalchemy .sql import ClauseElement
7
- from sqlalchemy .sql .ddl import DDLElement
8
7
9
8
from databases .backends .common .records import Record , create_column_maps
10
- from databases .backends .dialects .psycopg import get_dialect
11
- from databases .core import LOG_EXTRA , DatabaseURL
9
+ from databases .backends .dialects .psycopg import compile_query , get_dialect
10
+ from databases .core import DatabaseURL
12
11
from databases .interfaces import (
13
12
ConnectionBackend ,
14
13
DatabaseBackend ,
@@ -88,15 +87,15 @@ async def release(self) -> None:
88
87
89
88
async def fetch_all (self , query : ClauseElement ) -> typing .List [RecordInterface ]:
90
89
assert self ._connection is not None , "Connection is not acquired"
91
- query_str , args , result_columns = self . _compile (query )
90
+ query_str , args , result_columns = compile_query (query , self . _dialect )
92
91
rows = await self ._connection .fetch (query_str , * args )
93
92
dialect = self ._dialect
94
93
column_maps = create_column_maps (result_columns )
95
94
return [Record (row , result_columns , dialect , column_maps ) for row in rows ]
96
95
97
96
async def fetch_one (self , query : ClauseElement ) -> typing .Optional [RecordInterface ]:
98
97
assert self ._connection is not None , "Connection is not acquired"
99
- query_str , args , result_columns = self . _compile (query )
98
+ query_str , args , result_columns = compile_query (query , self . _dialect )
100
99
row = await self ._connection .fetchrow (query_str , * args )
101
100
if row is None :
102
101
return None
@@ -124,7 +123,7 @@ async def fetch_val(
124
123
125
124
async def execute (self , query : ClauseElement ) -> typing .Any :
126
125
assert self ._connection is not None , "Connection is not acquired"
127
- query_str , args , _ = self . _compile (query )
126
+ query_str , args , _ = compile_query (query , self . _dialect )
128
127
return await self ._connection .fetchval (query_str , * args )
129
128
130
129
async def execute_many (self , queries : typing .List [ClauseElement ]) -> None :
@@ -133,51 +132,21 @@ async def execute_many(self, queries: typing.List[ClauseElement]) -> None:
133
132
# loop through multiple executes here, which should all end up
134
133
# using the same prepared statement.
135
134
for single_query in queries :
136
- single_query , args , _ = self . _compile (single_query )
135
+ single_query , args , _ = compile_query (single_query , self . _dialect )
137
136
await self ._connection .execute (single_query , * args )
138
137
139
138
async def iterate (
140
139
self , query : ClauseElement
141
140
) -> typing .AsyncGenerator [typing .Any , None ]:
142
141
assert self ._connection is not None , "Connection is not acquired"
143
- query_str , args , result_columns = self . _compile (query )
142
+ query_str , args , result_columns = compile_query (query , self . _dialect )
144
143
column_maps = create_column_maps (result_columns )
145
144
async for row in self ._connection .cursor (query_str , * args ):
146
145
yield Record (row , result_columns , self ._dialect , column_maps )
147
146
148
147
def transaction (self ) -> TransactionBackend :
149
148
return AsyncpgTransaction (connection = self )
150
149
151
- def _compile (self , query : ClauseElement ) -> typing .Tuple [str , list , tuple ]:
152
- compiled = query .compile (
153
- dialect = self ._dialect , compile_kwargs = {"render_postcompile" : True }
154
- )
155
-
156
- if not isinstance (query , DDLElement ):
157
- compiled_params = sorted (compiled .params .items ())
158
-
159
- mapping = {
160
- key : "$" + str (i ) for i , (key , _ ) in enumerate (compiled_params , start = 1 )
161
- }
162
- compiled_query = compiled .string % mapping
163
-
164
- processors = compiled ._bind_processors
165
- args = [
166
- processors [key ](val ) if key in processors else val
167
- for key , val in compiled_params
168
- ]
169
- result_map = compiled ._result_columns
170
- else :
171
- compiled_query = compiled .string
172
- args = []
173
- result_map = None
174
-
175
- query_message = compiled_query .replace (" \n " , " " ).replace ("\n " , " " )
176
- logger .debug (
177
- "Query: %s Args: %s" , query_message , repr (tuple (args )), extra = LOG_EXTRA
178
- )
179
- return compiled_query , args , result_map
180
-
181
150
@property
182
151
def raw_connection (self ) -> asyncpg .connection .Connection :
183
152
assert self ._connection is not None , "Connection is not acquired"
0 commit comments