summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy
Commit message (Collapse)AuthorAgeFilesLines
* Replace c extension with cython versions.workflow_test_cythonFederico Caselli2021-12-1730-2847/+1554
| | | | | | | | | | | | | | | Re-implement c version immutabledict / processors / resultproxy / utils with cython. Performance is in general in par or better than the c version Added a collection module that has cython version of OrderedSet and IdentitySet Added a new test/perf file to compare the implementations. Run ``python test/perf/compiled_extensions.py all`` to execute the comparison test. See results here: https://docs.google.com/document/d/1nOcDGojHRtXEkuy4vNXcW_XOJd9gqKhSeALGG3kYr6A/edit?usp=sharing Fixes: #7256 Change-Id: I2930ef1894b5048210384728118e586e813f6a76 Signed-off-by: Federico Caselli <cfederico87@gmail.com>
* include InterfaceError for mariadb disconnect checkMike Bayer2021-12-161-9/+14
| | | | | | | | | | | | | | | | | Corrected the error classes inspected for the "is_disconnect" check for the ``mariadbconnector`` dialect, which was failing for disconnects that occurred due to common MySQL/MariaDB error codes such as 2006; the DBAPI appears to currently use the ``mariadb.InterfaceError`` exception class for disconnect errors such as error code 2006, which has been added to the list of classes checked. For the current "real reconnect test", shutting down the mariadb connection from the client side produces ProgrammingError("Connection isn't valid anymore") which we also continue to intercept. Fixes: #7457 Change-Id: I0b37cd7a73359a23ad756ff2af0a9333c841221b
* Merge "implement correct errors for Row immutability" into mainmike bayer2021-12-121-13/+24
|\
| * implement correct errors for Row immutabilityMike Bayer2021-12-091-13/+24
| | | | | | | | | | | | | | | | | | | | Corrected the error message for the ``AttributeError`` that's raised when attempting to write to an attribute on the :class:`_result.Row` class, which is immutable. The previous message claimed the column didn't exist which is misleading. Fixes: #7432 Change-Id: If0e2cbd3f763dca6c99a18aa42252c69f1207d59
* | use the options from the cached statement for propagate_optionsMike Bayer2021-12-121-1/+21
| | | | | | | | | | | | | | | | | | | | | | Fixed caching-related issue where the use of a loader option of the form ``lazyload(aliased(A).bs).joinedload(B.cs)`` would fail to result in the joinedload being invoked for runs subsequent to the query being cached, due to a mismatch for the options / object path applied to the objects loaded for a query with a lead entity that used ``aliased()``. Fixes: #7447 Change-Id: I4e9c34654b7d3668cd8878decbd688afe2af5f81
* | Merge "Add execution options to ``Session.get``" into mainFederico Caselli2021-12-111-0/+15
|\ \
| * | Add execution options to ``Session.get``Federico Caselli2021-12-101-0/+15
| | | | | | | | | | | | | | | Fixes: #7410 Change-Id: Iab6427b8b4c2ada8c31ef69f92d27c1185dbb6b1
* | | Merge "Add async_engine_from_config()" into mainFederico Caselli2021-12-112-0/+24
|\ \ \
| * | | Add async_engine_from_config()Nils Philippsen2021-12-102-0/+24
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Added :func:`_asyncio.async_engine_config` function to create an async engine from a configuration dict. This otherwise behaves the same as :func:`_sa.engine_from_config`. Fixes: #7301 Closes: #7302 Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/7302 Pull-request-sha: c7c758833b6c37b7509b8c5bed4f26ac0ccc0395 Change-Id: I64feadf95b5015c24fe0fa0dbae6755b72d1713e
* | | | Merge "Removals: strings for join(), loader_options()." into mainmike bayer2021-12-105-183/+85
|\ \ \ \ | |/ / / |/| | |
| * | | Removals: strings for join(), loader_options().Mike Bayer2021-12-085-183/+85
| | |/ | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * The :meth:`_orm.Query.join` method no longer accepts strings for relationship names; the long-documented approach of using ``Class.attrname`` for join targets is now standard. * Loader options no longer accept strings for attribute names. The long-documented approach of using ``Class.attrname`` for loader option targets is now standard. It is hoped that a subsequent commit can refactor loader options to no longer need "UnboundLoad" for most cases. Change-Id: If4629882c40523dccbf4459256bf540fb468b618 References: #6986
* | | Update references to tables in PostgreSQL documentationLeo Singer2021-12-101-4/+4
| | | | | | | | | | | | | | | Since the table numbers change from one version of PostgreSQL to the next, refer to the tables by name rather than by number.
* | | Include import error message when greenlet is not installedFederico Caselli2021-12-091-2/+6
| |/ |/| | | | | | | Fixes: #7419 Change-Id: I0c604875a80287acff3bab732f67601a5e2db98c
* | Merge branch 'typos-fixes' into main_gerritFederico Caselli2021-12-091-1/+1
|\ \ | | | | | | | | | Change-Id: I32a4c97add07a3fe7d2d5cc4f1cd263b2042e123
| * | Fix typo in docstringLele Gaifax2021-12-091-1/+1
| |/
* | implement attributes.Proxy._clone()Mike Bayer2021-12-091-0/+10
|/ | | | | | | | | | | Fixed issue where the internal cloning used by the :meth:`_orm.PropComparator.any` method on a :func:`_orm.relationship` in the case where the related class also makes use of ORM polymorphic loading, would fail if a hybrid property on the related, polymorphic class were used within the criteria for the ``any()`` operation. Fixes: #7425 Change-Id: I5f4f4ec5fab17df228bc6e3de412d24114b20600
* Merge "Warn when caching is disabled / document" into mainmike bayer2021-12-0721-25/+338
|\
| * Warn when caching is disabled / documentMike Bayer2021-12-0621-25/+338
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This patch adds new warnings for all elements that don't indicate their caching behavior, including user-defined ClauseElement subclasses and third party dialects. it additionally adds new documentation to discuss an apparent performance degradation in 1.4 when caching is disabled as a result in the significant expense incurred by ORM lazy loaders, which in 1.3 used BakedQuery so were actually cached. As a result of adding the warnings, a fair degree of lesser used SQL expression objects identified that they did not define caching behavior so would have been producing ``[no key]``, including PostgreSQL constructs ``hstore`` and ``array``. These have been amended to use inherit cache where appropriate. "on conflict" constructs in PostgreSQL, MySQL, SQLite still explicitly don't generate a cache key at this time. The change also adds a test for all constructs via assert_compile() to assert they will not generate cache warnings. Fixes: #7394 Change-Id: I85958affbb99bfad0f5efa21bc8f2a95e7e46981
* | Merge "contextmanager skips rollback if trans says to skip it" into mainmike bayer2021-12-073-2/+31
|\ \
| * | contextmanager skips rollback if trans says to skip itMike Bayer2021-12-063-2/+31
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Fixed issue where if an exception occurred when the :class:`_orm.Session` were to close the connection within the :meth:`_orm.Session.commit` method, when using a context manager for :meth:`_orm.Session.begin` , it would attempt a rollback which would not be possible as the :class:`_orm.Session` was in between where the transaction is committed and the connection is then to be returned to the pool, raising the exception "this sessiontransaction is in the committed state". This exception can occur mostly in an asyncio context where CancelledError can be raised. Fixes: #7388 Change-Id: I1a85a3a7eae79f3553ddf1e3d245a0d90b0a2f40
* | | Merge "Add __copy__, __deepcopy__ to URL. Fixes: #7400" into mainmike bayer2021-12-061-0/+16
|\ \ \
| * | | Add __copy__, __deepcopy__ to URL. Fixes: #7400Tom Ritchford2021-12-061-0/+16
| | |/ | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Added support for ``copy()`` and ``deepcopy()`` to the :class:`_url.URL` class. Pull request courtesy Tom Ritchford. Fixes: #7400 Closes: #7401 Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/7401 Pull-request-sha: a2c1b8992f5d153c6210178cda47b8ae96b91fb5 Change-Id: I55977338b2655a7d4f733ae786d31e589185e9ca
* | | fix typo in exists documentationFederico Caselli2021-12-051-1/+1
| | | | | | | | | | | | Change-Id: I44d8d6ee4816052a8dda64c00905b17b7ad8698e
* | | The where method of exists now accepts multiple cluase.Federico Caselli2021-12-041-2/+8
|/ / | | | | | | | | | | | | | | | | Support multiple clause elements in the :meth:`_sql.Exists.where` method, unifying the api with the on presented by a normal :func:`_sql.select` construct. Fixes: #7386 Change-Id: I5df20478008cd5167053d357cbfad8a641c62b44
* | Merge "Removals: MetaData.bind, Table.bind, all other .bind" into mainmike bayer2021-12-0312-673/+56
|\ \
| * | Removals: MetaData.bind, Table.bind, all other .bindMike Bayer2021-12-0212-673/+56
| |/ | | | | | | | | Change-Id: I1ef2eb2018f4b68825fe40a2a8d99084cf217b35 References: #7257
* | Merge "copy list for __iadd__" into mainmike bayer2021-12-031-2/+2
|\ \
| * | copy list for __iadd__Mike Bayer2021-12-021-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | Fixed issue where a list mapped with :func:`_orm.relationship` would go into an endless loop if in-place added to itself, i.e. the ``+=`` operator were used, as well as if ``.extend()`` were given the same list. Fixes: #7389 Change-Id: Idd5118420f8bc684d1ee36b2b6d4c5812f36cc4c
* | | Merge "Add __class_getitem__ to the declarative Base class" into mainmike bayer2021-12-021-0/+2
|\ \ \ | |/ / |/| |
| * | Add __class_getitem__ to the declarative Base classKai Mueller2021-12-011-0/+2
| |/ | | | | | | | | | | | | | | | | | | | | | | | | | | | | Fixed issue where the :func:`_orm.as_declarative` decorator and similar functions used to generate the declarative base class would not copy the ``__class_getitem__()`` method from a given superclass, which prevented the use of pep-484 generics in conjunction with the ``Base`` class. Pull request courtesy Kai Mueller. Fixes: #7368 Closes: #7381 Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/7381 Pull-request-sha: 7db7fd869a6bb617f767fad5b71ddf7cb5f14ff5 Change-Id: I495718c3082ad6dd2c83fdbf6feba7c529e351cb
* | fix typo in documentationFederico Caselli2021-12-011-1/+1
|/ | | | Change-Id: I620977b0665d9b3c2cc9ade9db475c357f537ff9
* Merge "Fixes: #4390" into mainmike bayer2021-11-301-0/+9
|\
| * Fixes: #4390jonathan vanasco2021-11-081-0/+9
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Deprecated an undocumented loader option syntax ``".*"``, which appears to be no different than passing a single asterisk, and will emit a deprecation warning if used. This syntax may have been intended for something but there is currently no need for it. The original ticket was to document the `.{WILDCARD}` (e.g. `.*`) format, however this format does not appear to be used or needed by SQLAlchemy and is likely not used by any projects or developers. This PR invokes `util.warn_deprecated` to notify users this functionality is deprecated, and directs them to the #4390 issue if they actually use it. Assuming there are no complaints over this warning in the coming months, this code can be removed in a future major release. Change-Id: I665e3ac26be0a7819246a2ee56fb5a5f32980c91
* | Merge "document get_bind() overrides for async session" into mainmike bayer2021-11-301-1/+78
|\ \
| * | document get_bind() overrides for async sessionMike Bayer2021-11-291-1/+78
| | | | | | | | | | | | | | | Change-Id: Ifcc936a5861d49857d1f365416190cfbd0981aac References: #7383
* | | scoped_session adjustmentsMike Bayer2021-11-301-4/+4
| | | | | | | | | | | | | | | | | | | | | * fix typo, change to a note the async scoped session note * more dragons re: threading.local() Change-Id: I76266507510e4014456d992656f4aadf6d03ba4a
* | | Merge "adapt pytest plugin to support pytest v7" into mainmike bayer2021-11-294-79/+90
|\ \ \ | |/ / |/| |
| * | adapt pytest plugin to support pytest v7Federico Caselli2021-11-294-79/+90
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Implemented support for the test suite to run correctly under Pytest 7. Previously, only Pytest 6.x was supported for Python 3, however the version was not pinned on the upper bound in tox.ini. Pytest is not pinned in tox.ini to be lower than version 8 so that SQLAlchemy versions released with the current codebase will be able to be tested under tox without changes to the environment. Much thanks to the Pytest developers for their help with this issue. Change-Id: I3b12166199be2b913ee16e78b3ebbff415654396
* | | Merge "provide connectionfairy on initialize" into mainmike bayer2021-11-2931-484/+1171
|\ \ \ | |/ / |/| |
| * | provide connectionfairy on initializeMike Bayer2021-11-2931-484/+1171
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This is so that dialect methods that are called within init can assume the same argument structure as when they are called in other places; we can nail down the type of object as well. This change seems to mostly impact the isolation level routines in the dialects, as these are called during initialize() as well as on established connections. these methods can now assume a non-proxied DBAPI connection object in all cases, as it is commonly required that attributes like ".autocommit" are set on the object which don't work well in a proxied situation. Other changes: * adds an interface for the "connectionfairy" concept called PoolProxiedConnection. * Removes ``Connectable`` superclass of Connection. ``Connectable`` was originally meant to provide for the "method which accepts connection or engine" theme. As this pattern is greatly reduced in 2.0 and Engine no longer extends from it, the ``Connectable`` superclass doesnt serve any real purpose. Leading from that, to set this in I also applied pep 484 annotations to the Dialect base, and then in the interests of seeing some of the typing information show up in my IDE did a little bit for Engine, Connection and others. I hope that it's feasible that we can add annotations to specific classes and attributes ahead of when we actually try to mass-populate the whole library. This was the original spirit of pep-484 that we can apply annotations gradually. I do of course want to try to do a mass-populate although i think even in that case we will end up doing a lot of manual work anyway (in particular for the changes here which are distinct from what the stubs have). Fixes: #7122 Change-Id: I5dd7fbff8a7ae520a81c165091af12a6a68826db
* | | Fix a typo in psycopg_async module name (#7369)Denis Laxalde2021-11-271-2/+2
|/ /
* | Added support for ``psycopg`` dialect.Federico Caselli2021-11-2619-179/+948
| | | | | | | | | | | | | | Both sync and async versions are supported. Fixes: #6842 Change-Id: I57751c5028acebfc6f9c43572562405453a2f2a4
* | Merge "propose emulated setinputsizes embedded in the compiler" into mainmike bayer2021-11-2515-268/+296
|\ \
| * | propose emulated setinputsizes embedded in the compilerMike Bayer2021-11-2315-268/+296
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Add a new system so that PostgreSQL and other dialects have a reliable way to add casts to bound parameters in SQL statements, replacing previous use of setinputsizes() for PG dialects. rationale: 1. psycopg3 will be using the same SQLAlchemy-side "setinputsizes" as asyncpg, so we will be seeing a lot more of this 2. the full rendering that SQLAlchemy's compilation is performing is in the engine log as well as error messages. Without this, we introduce three levels of SQL rendering, the compiler, the hidden "setinputsizes" in SQLAlchemy, and then whatever the DBAPI driver does. With this new approach, users reporting bugs etc. will be less confused that there are as many as two separate layers of "hidden rendering"; SQLAlchemy's rendering is again fully transparent 3. calling upon a setinputsizes() method for every statement execution is expensive. this way, the work is done behind the caching layer 4. for "fast insertmany()", I also want there to be a fast approach towards setinputsizes. As it was, we were going to be taking a SQL INSERT with thousands of bound parameter placeholders and running a whole second pass on it to apply typecasts. this way, we will at least be able to build the SQL string once without a huge second pass over the whole string 5. psycopg2 can use this same system for its ARRAY casts 6. the general need for PostgreSQL to have lots of type casts is now mostly in the base PostgreSQL dialect and works independently of a DBAPI being present. dependence on DBAPI symbols that aren't complete / consistent / hashable is removed I was originally going to try to build this into bind_expression(), but it was revealed this worked poorly with custom bind_expression() as well as empty sets. the current impl also doesn't need to run a second expression pass over the POSTCOMPILE sections, which came out better than I originally thought it would. Change-Id: I363e6d593d059add7bcc6d1f6c3f91dd2e683c0c
* | | Clean up most py3k compatFederico Caselli2021-11-24105-1486/+590
|/ / | | | | | | Change-Id: I8172fdcc3103ff92aa049827728484c8779af6b7
* | Support lightweight compiler column elements w/ slotsMike Bayer2021-11-227-94/+164
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | the _CompileLabel class included ``__slots__`` but these weren't used as the superclasses included slots. Create a ``__slots__`` superclass for ``ClauseElement``, creating a new class of compilable SQL elements that don't include heavier features like caching, annotations and cloning, which are meant to be used only in an ad-hoc compiler fashion. Create new ``CompilerColumnElement`` from that which serves in column-oriented contexts, but similarly does not include any expression operator support as it is intended to be used only to generate a string. Apply this to both ``_CompileLabel`` as well as PostgreSQL ``_ColonCast``, which does not actually subclass ``ColumnElement`` as this class has memoized attributes that aren't worth changing, and does not include SQL operator capabilities as these are not needed for these compiler-only objects. this allows us to more inexpensively add new ad-hoc labels / casts etc. at compile time, as we will be seeking to expand out the typecasts that are needed for PostgreSQL dialects in a subsequent patch. Change-Id: I52973ae3295cb6e2eb0d7adc816c678a626643ed
* | Remove object in class definitionFederico Caselli2021-11-2295-229/+229
| | | | | | | | | | References: #4600 Change-Id: I2a62ddfe00bc562720f0eae700a497495d7a987a
* | Merge "generalize cache_ok to UserDefinedType" into mainmike bayer2021-11-192-58/+193
|\ \
| * | generalize cache_ok to UserDefinedTypeMike Bayer2021-11-172-58/+193
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Extended the ``cache_ok`` flag and corresponding warning message if this flag is not defined, a behavior first established for :class:`.TypeDecorator` as part of :ticket:`6436`, to also take place for :class:`.UserDefinedType`, by generalizing the flag and associated caching logic to a new common base for these two types, :class:`.ExternalType`. The change means any current :class:`.UserDefinedType` will now cause SQL statement caching to no longer take place for statements which make use of the datatype, along with a warning being emitted, unless the class defines the :attr:`.UserDefinedType.cache_ok` flag as True. If the datatype cannot form a deterministic, hashable cache key derived from its arguments, it may return False which will continue to keep caching disabled but will suppress the warning. In particular, custom datatypes currently used in packages such as SQLAlchemy-utils will need to implement this flag. The issue was observed as a result of a SQLAlchemy-utils datatype that is not currently cacheable. Fixes: #7319 Change-Id: Ie0b5d4587df87bfe66d2fe7cd4585c3882584575
* | | Merge "disable raiseerr for refresh state loader options" into mainmike bayer2021-11-181-1/+2
|\ \ \