SQLAlchemy 2.1.0b2__py3-none-any.whl → 2.1.0b3__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.
Files changed (141) hide show
  1. sqlalchemy/__init__.py +1 -1
  2. sqlalchemy/connectors/pyodbc.py +13 -4
  3. sqlalchemy/dialects/_typing.py +0 -1
  4. sqlalchemy/dialects/mssql/__init__.py +0 -1
  5. sqlalchemy/dialects/mssql/base.py +1056 -437
  6. sqlalchemy/dialects/mssql/information_schema.py +61 -1
  7. sqlalchemy/dialects/mssql/mssqlpython.py +8 -2
  8. sqlalchemy/dialects/mssql/pymssql.py +1 -0
  9. sqlalchemy/dialects/mssql/pyodbc.py +0 -1
  10. sqlalchemy/dialects/mysql/aiomysql.py +27 -2
  11. sqlalchemy/dialects/mysql/asyncmy.py +25 -3
  12. sqlalchemy/dialects/mysql/base.py +20 -2
  13. sqlalchemy/dialects/mysql/cymysql.py +1 -0
  14. sqlalchemy/dialects/mysql/mariadbconnector.py +1 -0
  15. sqlalchemy/dialects/mysql/mysqlconnector.py +3 -2
  16. sqlalchemy/dialects/mysql/mysqldb.py +1 -0
  17. sqlalchemy/dialects/mysql/pymysql.py +30 -9
  18. sqlalchemy/dialects/mysql/pyodbc.py +1 -0
  19. sqlalchemy/dialects/mysql/reflection.py +3 -3
  20. sqlalchemy/dialects/oracle/base.py +1 -133
  21. sqlalchemy/dialects/oracle/cx_oracle.py +1 -0
  22. sqlalchemy/dialects/oracle/json.py +0 -1
  23. sqlalchemy/dialects/oracle/oracledb.py +1 -0
  24. sqlalchemy/dialects/oracle/vector.py +2 -4
  25. sqlalchemy/dialects/postgresql/__init__.py +0 -1
  26. sqlalchemy/dialects/postgresql/_psycopg_common.py +1 -1
  27. sqlalchemy/dialects/postgresql/asyncpg.py +4 -1
  28. sqlalchemy/dialects/postgresql/base.py +41 -120
  29. sqlalchemy/dialects/postgresql/ext.py +6 -0
  30. sqlalchemy/dialects/postgresql/hstore.py +2 -3
  31. sqlalchemy/dialects/postgresql/operators.py +0 -1
  32. sqlalchemy/dialects/postgresql/pg8000.py +3 -5
  33. sqlalchemy/dialects/postgresql/psycopg.py +1 -0
  34. sqlalchemy/dialects/postgresql/psycopg2.py +1 -0
  35. sqlalchemy/dialects/postgresql/psycopg2cffi.py +1 -0
  36. sqlalchemy/dialects/sqlite/__init__.py +2 -0
  37. sqlalchemy/dialects/sqlite/aiosqlite.py +1 -0
  38. sqlalchemy/dialects/sqlite/base.py +13 -10
  39. sqlalchemy/dialects/sqlite/json.py +34 -0
  40. sqlalchemy/dialects/sqlite/pysqlcipher.py +0 -1
  41. sqlalchemy/dialects/sqlite/pysqlite.py +1 -0
  42. sqlalchemy/engine/_result_cy.py +91 -13
  43. sqlalchemy/engine/base.py +104 -101
  44. sqlalchemy/engine/create.py +1 -1
  45. sqlalchemy/engine/cursor.py +7 -3
  46. sqlalchemy/engine/default.py +116 -0
  47. sqlalchemy/engine/interfaces.py +1 -1
  48. sqlalchemy/engine/mock.py +0 -1
  49. sqlalchemy/engine/processors.py +1 -0
  50. sqlalchemy/engine/reflection.py +1 -0
  51. sqlalchemy/engine/result.py +56 -10
  52. sqlalchemy/event/api.py +1 -1
  53. sqlalchemy/event/attr.py +1 -0
  54. sqlalchemy/event/base.py +1 -0
  55. sqlalchemy/event/legacy.py +1 -0
  56. sqlalchemy/event/registry.py +1 -0
  57. sqlalchemy/exc.py +1 -0
  58. sqlalchemy/ext/__init__.py +0 -1
  59. sqlalchemy/ext/associationproxy.py +1 -0
  60. sqlalchemy/ext/asyncio/engine.py +1 -1
  61. sqlalchemy/ext/asyncio/scoping.py +2 -2
  62. sqlalchemy/ext/asyncio/session.py +2 -3
  63. sqlalchemy/ext/automap.py +1 -0
  64. sqlalchemy/ext/baked.py +0 -1
  65. sqlalchemy/ext/compiler.py +1 -0
  66. sqlalchemy/ext/declarative/extensions.py +1 -0
  67. sqlalchemy/ext/horizontal_shard.py +1 -1
  68. sqlalchemy/ext/instrumentation.py +1 -1
  69. sqlalchemy/ext/orderinglist.py +1 -0
  70. sqlalchemy/ext/serializer.py +0 -1
  71. sqlalchemy/future/__init__.py +1 -0
  72. sqlalchemy/inspection.py +1 -0
  73. sqlalchemy/log.py +2 -2
  74. sqlalchemy/orm/_typing.py +0 -3
  75. sqlalchemy/orm/clsregistry.py +61 -13
  76. sqlalchemy/orm/collections.py +1 -0
  77. sqlalchemy/orm/context.py +5 -1
  78. sqlalchemy/orm/decl_api.py +14 -11
  79. sqlalchemy/orm/decl_base.py +12 -15
  80. sqlalchemy/orm/dependency.py +1 -1
  81. sqlalchemy/orm/descriptor_props.py +1 -1
  82. sqlalchemy/orm/dynamic.py +0 -1
  83. sqlalchemy/orm/evaluator.py +0 -1
  84. sqlalchemy/orm/events.py +1 -0
  85. sqlalchemy/orm/instrumentation.py +0 -1
  86. sqlalchemy/orm/interfaces.py +0 -1
  87. sqlalchemy/orm/loading.py +27 -18
  88. sqlalchemy/orm/mapper.py +29 -0
  89. sqlalchemy/orm/persistence.py +1 -0
  90. sqlalchemy/orm/properties.py +3 -4
  91. sqlalchemy/orm/query.py +1 -1
  92. sqlalchemy/orm/relationships.py +29 -1
  93. sqlalchemy/orm/scoping.py +6 -5
  94. sqlalchemy/orm/session.py +81 -18
  95. sqlalchemy/orm/strategies.py +107 -58
  96. sqlalchemy/orm/strategy_options.py +14 -3
  97. sqlalchemy/orm/unitofwork.py +2 -3
  98. sqlalchemy/orm/util.py +13 -0
  99. sqlalchemy/pool/impl.py +1 -0
  100. sqlalchemy/sql/_annotated_cols.py +8 -3
  101. sqlalchemy/sql/_orm_types.py +0 -1
  102. sqlalchemy/sql/_util_cy.py +3 -3
  103. sqlalchemy/sql/base.py +0 -1
  104. sqlalchemy/sql/compiler.py +6 -1
  105. sqlalchemy/sql/crud.py +2 -1
  106. sqlalchemy/sql/ddl.py +1 -1
  107. sqlalchemy/sql/dml.py +47 -6
  108. sqlalchemy/sql/elements.py +8 -5
  109. sqlalchemy/sql/expression.py +0 -1
  110. sqlalchemy/sql/functions.py +75 -0
  111. sqlalchemy/sql/lambdas.py +2 -3
  112. sqlalchemy/sql/schema.py +3 -4
  113. sqlalchemy/sql/selectable.py +17 -28
  114. sqlalchemy/sql/sqltypes.py +1 -1
  115. sqlalchemy/sql/traversals.py +0 -1
  116. sqlalchemy/sql/util.py +2 -1
  117. sqlalchemy/testing/engines.py +0 -1
  118. sqlalchemy/testing/fixtures/base.py +47 -5
  119. sqlalchemy/testing/fixtures/mypy.py +7 -7
  120. sqlalchemy/testing/fixtures/orm.py +2 -2
  121. sqlalchemy/testing/fixtures/sql.py +2 -2
  122. sqlalchemy/testing/plugin/bootstrap.py +0 -1
  123. sqlalchemy/testing/plugin/pytestplugin.py +9 -5
  124. sqlalchemy/testing/profiling.py +0 -1
  125. sqlalchemy/testing/provision.py +0 -1
  126. sqlalchemy/testing/suite/test_reflection.py +0 -6
  127. sqlalchemy/testing/util.py +0 -1
  128. sqlalchemy/types.py +0 -1
  129. sqlalchemy/util/_collections.py +1 -1
  130. sqlalchemy/util/compat.py +1 -1
  131. sqlalchemy/util/langhelpers.py +17 -14
  132. sqlalchemy/util/preloaded.py +1 -0
  133. sqlalchemy/util/queue.py +1 -1
  134. sqlalchemy/util/tool_support.py +1 -0
  135. sqlalchemy/util/typing.py +2 -4
  136. {sqlalchemy-2.1.0b2.dist-info → sqlalchemy-2.1.0b3.dist-info}/METADATA +3 -3
  137. sqlalchemy-2.1.0b3.dist-info/RECORD +263 -0
  138. sqlalchemy-2.1.0b2.dist-info/RECORD +0 -263
  139. {sqlalchemy-2.1.0b2.dist-info → sqlalchemy-2.1.0b3.dist-info}/WHEEL +0 -0
  140. {sqlalchemy-2.1.0b2.dist-info → sqlalchemy-2.1.0b3.dist-info}/licenses/LICENSE +0 -0
  141. {sqlalchemy-2.1.0b2.dist-info → sqlalchemy-2.1.0b3.dist-info}/top_level.txt +0 -0
sqlalchemy/__init__.py CHANGED
@@ -284,7 +284,7 @@ from .types import Uuid as Uuid
284
284
  from .types import VARBINARY as VARBINARY
285
285
  from .types import VARCHAR as VARCHAR
286
286
 
287
- __version__ = "2.1.0b2"
287
+ __version__ = "2.1.0b3"
288
288
 
289
289
 
290
290
  def __go(lcls: Any) -> None:
@@ -77,10 +77,16 @@ class PyODBCConnector(Connector):
77
77
  else:
78
78
 
79
79
  def check_quote(token: str) -> str:
80
- if ";" in str(token) or str(token).startswith("{"):
80
+ if (
81
+ ";" in str(token)
82
+ or "}" in str(token)
83
+ or str(token).startswith("{")
84
+ ):
81
85
  token = "{%s}" % token.replace("}", "}}")
82
86
  return token
83
87
 
88
+ driver = keys.pop("driver", self.pyodbc_driver_name)
89
+
84
90
  keys = {k: check_quote(v) for k, v in keys.items()}
85
91
 
86
92
  dsn_connection = "dsn" in keys or (
@@ -96,7 +102,6 @@ class PyODBCConnector(Connector):
96
102
  port = ",%d" % int(keys.pop("port"))
97
103
 
98
104
  connectors = []
99
- driver = keys.pop("driver", self.pyodbc_driver_name)
100
105
  if driver is None and keys:
101
106
  # note if keys is empty, this is a totally blank URL
102
107
  util.warn(
@@ -105,7 +110,9 @@ class PyODBCConnector(Connector):
105
110
  "DSN-less connections"
106
111
  )
107
112
  else:
108
- connectors.append("DRIVER={%s}" % driver)
113
+ connectors.append(
114
+ "DRIVER={%s}" % str(driver).replace("}", "}}")
115
+ )
109
116
 
110
117
  connectors.extend(
111
118
  [
@@ -136,7 +143,9 @@ class PyODBCConnector(Connector):
136
143
  "AutoTranslate=%s" % keys.pop("odbc_autotranslate")
137
144
  )
138
145
 
139
- connectors.extend(["%s=%s" % (k, v) for k, v in keys.items()])
146
+ connectors.extend(
147
+ ["%s=%s" % (check_quote(k), v) for k, v in keys.items()]
148
+ )
140
149
 
141
150
  return ((";".join(connectors),), connect_args)
142
151
 
@@ -18,7 +18,6 @@ from ..sql.schema import Column
18
18
  from ..sql.schema import ColumnCollectionConstraint
19
19
  from ..sql.schema import Index
20
20
 
21
-
22
21
  _OnConflictConstraintT = Union[str, ColumnCollectionConstraint, Index, None]
23
22
  _OnConflictIndexElementsT = Optional[
24
23
  Iterable[Union[Column[Any], str, roles.DDLConstraintColumnRole]]
@@ -46,7 +46,6 @@ from .base import VARCHAR
46
46
  from .base import XML
47
47
  from ...sql import try_cast
48
48
 
49
-
50
49
  base.dialect = dialect = pyodbc.dialect
51
50
 
52
51