piccolo 1.13.0__py3-none-any.whl → 1.14.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
piccolo/__init__.py CHANGED
@@ -1 +1 @@
1
- __VERSION__ = "1.13.0"
1
+ __VERSION__ = "1.14.0"
piccolo/columns/base.py CHANGED
@@ -250,11 +250,11 @@ class ColumnMeta:
250
250
 
251
251
  if self.call_chain:
252
252
  column_name = (
253
- "$".join(
253
+ ".".join(
254
254
  t.cast(str, i._meta.db_column_name)
255
255
  for i in self.call_chain
256
256
  )
257
- + f"${column_name}"
257
+ + f".{column_name}"
258
258
  )
259
259
 
260
260
  return column_name
@@ -291,7 +291,7 @@ class ColumnMeta:
291
291
  'band$manager.name'
292
292
 
293
293
  >>> Band.manager.name._meta.get_full_name(with_alias=True)
294
- 'band$manager.name AS "manager$name"'
294
+ 'band$manager.name AS "manager.name"'
295
295
 
296
296
  :param include_quotes:
297
297
  If you're using the name in a SQL query, each component needs to be
piccolo/engine/base.py CHANGED
@@ -132,6 +132,13 @@ class Engine(t.Generic[TransactionClass], metaclass=ABCMeta):
132
132
  ):
133
133
  pass
134
134
 
135
+ def transform_response_to_dicts(self, results) -> t.List[t.Dict]:
136
+ """
137
+ If the database adapter returns something other than a list of
138
+ dictionaries, it should perform the transformation here.
139
+ """
140
+ return results
141
+
135
142
  @abstractmethod
136
143
  async def run_ddl(self, ddl: str, in_pool: bool = True):
137
144
  pass
@@ -579,6 +579,13 @@ class PostgresEngine(Engine[PostgresTransaction]):
579
579
 
580
580
  return response
581
581
 
582
+ def transform_response_to_dicts(self, results) -> t.List[t.Dict]:
583
+ """
584
+ asyncpg returns a special Record object, so we need to convert it to
585
+ a dict.
586
+ """
587
+ return [dict(i) for i in results]
588
+
582
589
  def atomic(self) -> Atomic:
583
590
  return Atomic(engine=self)
584
591
 
piccolo/query/base.py CHANGED
@@ -45,20 +45,11 @@ class Query(t.Generic[TableInstance, QueryResponseType]):
45
45
  raise ValueError("Engine isn't defined.")
46
46
 
47
47
  async def _process_results(self, results) -> QueryResponseType:
48
- if results:
49
- keys = results[0].keys()
50
- keys = [i.replace("$", ".") for i in keys]
51
- if self.engine_type in ("postgres", "cockroach"):
52
- # asyncpg returns a special Record object. We can pass it
53
- # directly into zip without calling `values` on it. This can
54
- # save us hundreds of microseconds, depending on the number of
55
- # results.
56
- raw = [dict(zip(keys, i)) for i in results]
57
- else:
58
- # SQLite returns a list of dictionaries.
59
- raw = [dict(zip(keys, i.values())) for i in results]
60
- else:
61
- raw = []
48
+ raw = (
49
+ self.table._meta.db.transform_response_to_dicts(results)
50
+ if results
51
+ else []
52
+ )
62
53
 
63
54
  if hasattr(self, "_raw_response_callback"):
64
55
  self._raw_response_callback(raw)
@@ -36,7 +36,13 @@ if t.TYPE_CHECKING: # pragma: no cover
36
36
  from piccolo.table import Table # noqa
37
37
 
38
38
  # Here to avoid breaking changes - will be removed in the future.
39
- from piccolo.query.functions.aggregate import Count # noqa: F401
39
+ from piccolo.query.functions.aggregate import ( # noqa: F401
40
+ Avg,
41
+ Count,
42
+ Max,
43
+ Min,
44
+ Sum,
45
+ )
40
46
 
41
47
 
42
48
  class SelectRaw(Selectable):
@@ -568,7 +574,7 @@ class Select(Query[TableInstance, t.List[t.Dict[str, t.Any]]]):
568
574
  query += "{}"
569
575
  args.append(distinct.querystring)
570
576
 
571
- columns_str = ", ".join("{}" for i in select_strings)
577
+ columns_str = ", ".join("{}" for _ in select_strings)
572
578
  query += f" {columns_str} FROM {self.table._meta.get_formatted_tablename()}" # noqa: E501
573
579
  args.extend(select_strings)
574
580
 
piccolo/querystring.py CHANGED
@@ -246,7 +246,7 @@ class QueryString(Selectable):
246
246
  self, engine_type: str, with_alias: bool = True
247
247
  ) -> QueryString:
248
248
  if with_alias and self._alias:
249
- return QueryString("{} AS " + self._alias, self)
249
+ return QueryString("{} AS " + f'"{self._alias}"', self)
250
250
  else:
251
251
  return self
252
252
 
piccolo/utils/pydantic.py CHANGED
@@ -206,7 +206,7 @@ def create_pydantic_model(
206
206
  ###########################################################################
207
207
 
208
208
  columns: t.Dict[str, t.Any] = {}
209
- validators: t.Dict[str, classmethod] = {}
209
+ validators: t.Dict[str, t.Callable] = {}
210
210
 
211
211
  piccolo_columns = tuple(
212
212
  table._meta.columns
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: piccolo
3
- Version: 1.13.0
3
+ Version: 1.14.0
4
4
  Summary: A fast, user friendly ORM and query builder which supports asyncio.
5
5
  Home-page: https://github.com/piccolo-orm/piccolo
6
6
  Author: Daniel Townsend
@@ -25,28 +25,28 @@ Requires-Python: >=3.8.0
25
25
  Description-Content-Type: text/markdown
26
26
  License-File: LICENSE
27
27
  Requires-Dist: black
28
- Requires-Dist: colorama >=0.4.0
29
- Requires-Dist: Jinja2 >=2.11.0
30
- Requires-Dist: targ >=0.3.7
31
- Requires-Dist: inflection >=0.5.1
32
- Requires-Dist: typing-extensions >=4.3.0
33
- Requires-Dist: pydantic[email] ==2.*
28
+ Requires-Dist: colorama (>=0.4.0)
29
+ Requires-Dist: Jinja2 (>=2.11.0)
30
+ Requires-Dist: targ (>=0.3.7)
31
+ Requires-Dist: inflection (>=0.5.1)
32
+ Requires-Dist: typing-extensions (>=4.3.0)
33
+ Requires-Dist: pydantic[email] (==2.*)
34
34
  Provides-Extra: all
35
- Requires-Dist: orjson >=3.5.1 ; extra == 'all'
35
+ Requires-Dist: orjson (>=3.5.1) ; extra == 'all'
36
36
  Requires-Dist: ipython ; extra == 'all'
37
- Requires-Dist: asyncpg >=0.21.0 ; extra == 'all'
38
- Requires-Dist: aiosqlite >=0.16.0 ; extra == 'all'
39
- Requires-Dist: uvloop >=0.12.0 ; (sys_platform != "win32") and extra == 'all'
37
+ Requires-Dist: asyncpg (>=0.21.0) ; extra == 'all'
38
+ Requires-Dist: aiosqlite (>=0.16.0) ; extra == 'all'
39
+ Requires-Dist: uvloop (>=0.12.0) ; (sys_platform != "win32") and extra == 'all'
40
40
  Provides-Extra: orjson
41
- Requires-Dist: orjson >=3.5.1 ; extra == 'orjson'
41
+ Requires-Dist: orjson (>=3.5.1) ; extra == 'orjson'
42
42
  Provides-Extra: playground
43
43
  Requires-Dist: ipython ; extra == 'playground'
44
44
  Provides-Extra: postgres
45
- Requires-Dist: asyncpg >=0.21.0 ; extra == 'postgres'
45
+ Requires-Dist: asyncpg (>=0.21.0) ; extra == 'postgres'
46
46
  Provides-Extra: sqlite
47
- Requires-Dist: aiosqlite >=0.16.0 ; extra == 'sqlite'
47
+ Requires-Dist: aiosqlite (>=0.16.0) ; extra == 'sqlite'
48
48
  Provides-Extra: uvloop
49
- Requires-Dist: uvloop >=0.12.0 ; (sys_platform != "win32") and extra == 'uvloop'
49
+ Requires-Dist: uvloop (>=0.12.0) ; (sys_platform != "win32") and extra == 'uvloop'
50
50
 
51
51
  ![Logo](https://raw.githubusercontent.com/piccolo-orm/piccolo/master/docs/logo_hero.png "Piccolo Logo")
52
52
 
@@ -1,8 +1,8 @@
1
- piccolo/__init__.py,sha256=_pdR4g2JWRC1g3rk3ruzcIk6hErZuJmLbmZNFfQFp2g,23
1
+ piccolo/__init__.py,sha256=vQd7XyktulZvg_rtkaOpG-2W02Gb_wFd8aev4i-MHeA,23
2
2
  piccolo/custom_types.py,sha256=7HMQAze-5mieNLfbQ5QgbRQgR2abR7ol0qehv2SqROY,604
3
3
  piccolo/main.py,sha256=1VsFV67FWTUikPTysp64Fmgd9QBVa_9wcwKfwj2UCEA,5117
4
4
  piccolo/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
- piccolo/querystring.py,sha256=_3enTH0oBx77LfpS9UG_5OGp5fMxmu50Dod5s1Gn9mY,9655
5
+ piccolo/querystring.py,sha256=yZdURtiVSlxkkEVJoFKAmL2OfNxrUr8xfsfuBBB7IuY,9662
6
6
  piccolo/schema.py,sha256=qNNy4tG_HqnXR9t3hHMgYXtGxHabwQAhUpc6RKLJ_gE,7960
7
7
  piccolo/table.py,sha256=IfXT9rtm1sBN-u_A8-_0gj6fJf3_RGSPtWMJa-FX9jw,49569
8
8
  piccolo/table_reflection.py,sha256=jrN1nHerDJ4tU09GtNN3hz7ap-7rXnSUjljFO6LB2H0,7094
@@ -115,7 +115,7 @@ piccolo/apps/user/piccolo_migrations/2020-06-11T21-38-55.py,sha256=JG_LFPrEljnSE
115
115
  piccolo/apps/user/piccolo_migrations/2021-04-30T16-14-15.py,sha256=Y_Dj4ROSxjnPsRDqcnpWeyk8UpF8c80T08_O2uq-GoA,1219
116
116
  piccolo/apps/user/piccolo_migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
117
117
  piccolo/columns/__init__.py,sha256=OYhO_n9anMiU9nL-K6ATq9FhAtm8RyMpqYQ7fTVbhxI,1120
118
- piccolo/columns/base.py,sha256=sgMiBvq-xLW6_W86g6XZTMc_3cskyeoMF6yIvIlnXsA,32487
118
+ piccolo/columns/base.py,sha256=_bg9yMWjMwE76Z7RDqi9iYSmtRuFx5bkx9uYJsFHKjQ,32487
119
119
  piccolo/columns/choices.py,sha256=-HNQuk9vMmVZIPZ5PMeXGTfr23o4nzKPSAkvcG1k0y8,723
120
120
  piccolo/columns/column_types.py,sha256=X_ZsA0C4WBNVonV2OsizRdt1osMshgtQ3Ob6JN-amfg,83485
121
121
  piccolo/columns/combination.py,sha256=vMXC2dfY7pvnCFhsT71XFVyb4gdQzfRsCMaiduu04Ss,6900
@@ -139,14 +139,14 @@ piccolo/columns/operators/string.py,sha256=M5ifxHP-ttJaE_wYCl23W5sJof4i5S5_QDIOv
139
139
  piccolo/conf/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
140
140
  piccolo/conf/apps.py,sha256=AlgOM2ePl9NQjME5AQxcZ5RbuQpjRywFCj5uHUsCIZU,19040
141
141
  piccolo/engine/__init__.py,sha256=Z0QR5NAA9jTFenY7pEJv1C8jZXBaFZojBUR3z3nx1cw,283
142
- piccolo/engine/base.py,sha256=0a2yFX5dxq1A-AKXF-wpeQvYwnl2g437UjgJ37jGV0w,6190
142
+ piccolo/engine/base.py,sha256=4NISWRuvgp5ShqJbOEK6g8ok8Ijqtp2gzuM9J6o_wSU,6444
143
143
  piccolo/engine/cockroach.py,sha256=gGnihplotMZMWqHwRnZYnnbKU3jFrwttwOlNtktoeLE,1522
144
144
  piccolo/engine/exceptions.py,sha256=X8xZiTF-L9PIqFT-KDXnv1jFIIOZMF8fYK692chttJE,44
145
145
  piccolo/engine/finder.py,sha256=GjzBNtzRzH79fjtRn7OI3nZiOXE8JfoQWAvHVPrPNx4,507
146
- piccolo/engine/postgres.py,sha256=o1K6i2nhFc5u8mqHQN8KBXXt40djRngwclAnjhVvBgk,18725
146
+ piccolo/engine/postgres.py,sha256=DekL3KafCdzSAEQ6_EgOiUB1ERXh2xpePYwI9QvmN-c,18955
147
147
  piccolo/engine/sqlite.py,sha256=KwJc3UttBP_8qSREbLJshqEfROF17ENf0Ju9BwI5_so,25236
148
148
  piccolo/query/__init__.py,sha256=bcsMV4813rMRAIqGv4DxI4eyO4FmpXkDv9dfTk5pt3A,699
149
- piccolo/query/base.py,sha256=G8Mwz0GcHY4Xs5Co9ubCNMI-3orfOsDdRDOnFRws7TU,15212
149
+ piccolo/query/base.py,sha256=2eyfgqdzl5bKQBRpmxil_HoXpCEDGGrh84q62ZmfBNk,14680
150
150
  piccolo/query/mixins.py,sha256=EFEFb9It4y1mR6_JXLn139h5M9KgeP750STYy5M4MLs,21951
151
151
  piccolo/query/proxy.py,sha256=Yq4jNc7IWJvdeO3u7_7iPyRy2WhVj8KsIUcIYHBIi9Q,1839
152
152
  piccolo/query/functions/__init__.py,sha256=pZkzOIh7Sg9HPNOeegOwAS46Oxt31ATlSVmwn-lxCbc,605
@@ -169,7 +169,7 @@ piccolo/query/methods/insert.py,sha256=ssLJ_wn08KnOwwr7t-VILyn1P4hrvM63CfPIcAJWT
169
169
  piccolo/query/methods/objects.py,sha256=iahDUziUtlx7pJ2uBAhdm3hCTmg2AS9C8cal1my5KR0,11705
170
170
  piccolo/query/methods/raw.py,sha256=VhYpCB52mZk4zqFTsqK5CHKTDGskUjISXTBV7UjohmA,600
171
171
  piccolo/query/methods/refresh.py,sha256=P1Eo_HYU_L7kcGM_cvDDgyLi1boCXY7Pc4tv_eDAzvc,2769
172
- piccolo/query/methods/select.py,sha256=DjiTTyqoh95nK0m6Ru3UKjzybe1S5JlfeJ9IB2xR4VI,21270
172
+ piccolo/query/methods/select.py,sha256=KDbLRkADM9xNQsoNYN_eNSwapFACQCUNiCvw0B5tmko,21315
173
173
  piccolo/query/methods/table_exists.py,sha256=0yb3n6Jd2ovSBWlZ-gl00K4E7Jnbj7J8qAAX5d7hvNk,1259
174
174
  piccolo/query/methods/update.py,sha256=LfWqIXEl1aecc0rkVssTFmwyD6wXGhlKcTrUVhtlEsw,3705
175
175
  piccolo/testing/__init__.py,sha256=pRFSqRInfx95AakOq54atmvqoB-ue073q2aR8u8zR40,83
@@ -183,7 +183,7 @@ piccolo/utils/list.py,sha256=4hPGiksJWxL226W7gyYBcqVGgMTgVa2jP8zvalc3zw8,1541
183
183
  piccolo/utils/naming.py,sha256=d7_mMscguK799RMhxFDifRgn8Ply5wiy2k1KkP22WUs,276
184
184
  piccolo/utils/objects.py,sha256=NjhfH57Q__1xSf4gvLtZFle3Lp0PiqPR7AcsVhkA3MY,1631
185
185
  piccolo/utils/printing.py,sha256=5VWNSfOrIGPh1VM-7fd4K18RGCYk0FQ5o-D4aLhzXZE,1748
186
- piccolo/utils/pydantic.py,sha256=_8jzsZQioBIziriMJauma2Fto8jhP0qoi4mob2LM-NA,12328
186
+ piccolo/utils/pydantic.py,sha256=RhoQZ7ddmFmepVcslHXMqmynbSVch7XLKUSgJkLuQS0,12327
187
187
  piccolo/utils/repr.py,sha256=K3w-TAP9WPx8tbAIB2XDab_C4PHsPrB9TzwWfOHa4cc,787
188
188
  piccolo/utils/sql_values.py,sha256=pGXmVTw6pWr8q7QA4xs7NiKSwjBzhN--3HXVjQv2SQQ,1749
189
189
  piccolo/utils/sync.py,sha256=j9Abkxn5HHS6HyvfpMzb1zV_teTkFHVhaIxu9rrSwSU,819
@@ -365,9 +365,9 @@ tests/utils/test_sql_values.py,sha256=vzxRmy16FfLZPH-sAQexBvsF9MXB8n4smr14qoEOS5
365
365
  tests/utils/test_sync.py,sha256=9ytVo56y2vPQePvTeIi9lHIouEhWJbodl1TmzkGFrSo,799
366
366
  tests/utils/test_table_reflection.py,sha256=SIzuat-IpcVj1GCFyOWKShI8YkhdOPPFH7qVrvfyPNE,3794
367
367
  tests/utils/test_warnings.py,sha256=NvSC_cvJ6uZcwAGf1m-hLzETXCqprXELL8zg3TNLVMw,269
368
- piccolo-1.13.0.dist-info/LICENSE,sha256=zFIpi-16uIJ420UMIG75NU0JbDBykvrdnXcj5U_EYBI,1059
369
- piccolo-1.13.0.dist-info/METADATA,sha256=_91g-EFcPz7HM3RBSgIfTtyRehV0IfI-vXRZ12XqJ1I,5150
370
- piccolo-1.13.0.dist-info/WHEEL,sha256=mguMlWGMX-VHnMpKOjjQidIo1ssRlCFu4a4mBpz1s2M,91
371
- piccolo-1.13.0.dist-info/entry_points.txt,sha256=SJPHET4Fi1bN5F3WqcKkv9SClK3_F1I7m4eQjk6AFh0,46
372
- piccolo-1.13.0.dist-info/top_level.txt,sha256=-SR74VGbk43VoPy1HH-mHm97yoGukLK87HE5kdBW6qM,24
373
- piccolo-1.13.0.dist-info/RECORD,,
368
+ piccolo-1.14.0.dist-info/LICENSE,sha256=zFIpi-16uIJ420UMIG75NU0JbDBykvrdnXcj5U_EYBI,1059
369
+ piccolo-1.14.0.dist-info/METADATA,sha256=4rDBz-Wbqp-MdHwcZd3LaxJToiNqW5hVFQkCOkCD8LU,5178
370
+ piccolo-1.14.0.dist-info/WHEEL,sha256=rWxmBtp7hEUqVLOnTaDOPpR-cZpCDkzhhcBce-Zyd5k,91
371
+ piccolo-1.14.0.dist-info/entry_points.txt,sha256=SJPHET4Fi1bN5F3WqcKkv9SClK3_F1I7m4eQjk6AFh0,46
372
+ piccolo-1.14.0.dist-info/top_level.txt,sha256=-SR74VGbk43VoPy1HH-mHm97yoGukLK87HE5kdBW6qM,24
373
+ piccolo-1.14.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (70.1.1)
2
+ Generator: setuptools (71.0.4)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5