Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

✨ Upgrade SQLAlchemy to 2.0, including initial work by farahats9 #700

Merged
merged 43 commits into from
Nov 18, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
60318b4
migration to sqlalchemy 2.0
farahats9 Mar 7, 2023
48ddc61
fix some linting errors
farahats9 Mar 24, 2023
b48423f
remove unused imports
farahats9 Mar 24, 2023
9c219d9
Update sqlmodel/sql/expression.py
farahats9 Mar 31, 2023
37ed979
reflecting python 3.6 deprecation in docs and tests
farahats9 Mar 31, 2023
0eee8e8
Merge branch 'main' of https://github.com/farahats9/sqlmodel
farahats9 Mar 31, 2023
050cf02
resolving @sbor23 comments
farahats9 Mar 31, 2023
fbff99c
add the new Subquery class
farahats9 Apr 30, 2023
6d8f527
update to latest sqlalchemy version
farahats9 Apr 30, 2023
4ce8d07
fix jinja2 template
farahats9 Apr 30, 2023
ecfb321
`Result` expects a type `Tuple[_T]`
peterlandry Jul 26, 2023
3738a7f
Remove unused type ignore
peterlandry Jul 26, 2023
814988b
Result seems well enough typed in SqlAlchemy now we can simply shim over
peterlandry Jul 26, 2023
118ca33
Implicit export of ForwardRef was remove in pydantic
peterlandry Jul 26, 2023
9170729
_Select expects a `Tuple[Any, ...]`
peterlandry Jul 26, 2023
7f5ba1c
Use Dict type instead of Mapping for SqlAlchemy compat
peterlandry Jul 26, 2023
e942e5e
Execution options are not Optional in SA
peterlandry Jul 26, 2023
ef9f00a
Another instance of non-optional execution_options
peterlandry Jul 26, 2023
643cea5
Fix Tuple in jinja template as well
peterlandry Jul 26, 2023
b89adbb
Use ForUpdateArg from sqlalchemy
peterlandry Jul 26, 2023
eff0803
Fix signature for `Session.get`
peterlandry Jul 26, 2023
c5bdbcc
Merge pull request #2 from peterlandry/main
farahats9 Jul 27, 2023
1752f0b
formatting and remove unused type
farahats9 Jul 27, 2023
b4f4a4f
🔀 Merge branch 'main' into sa2-a
tiangolo Nov 7, 2023
4d264a3
📝 Do not claim Python 3.11 yet, this will be done in a subsequent PR
tiangolo Nov 7, 2023
5f52693
🔥 Remove no longer necessary engine module, it was only to provide ty…
tiangolo Nov 7, 2023
0468d6f
⏪️ Revert altering tutorial, avoiding lack of support for forward ref…
tiangolo Nov 17, 2023
fcb92a0
🐛 Fix support for forward references in relationships
tiangolo Nov 17, 2023
f02584b
✅ Update tests for newest FastAPI with OpenAPI 3.1.0
tiangolo Nov 17, 2023
f4127d2
⏪️ Revert altering tutorial to accomodate for the previous lack of su…
tiangolo Nov 17, 2023
50cb798
✨ Update and refactor expression (and template) with new types from S…
tiangolo Nov 17, 2023
2083ba6
🎨 Update type annotation in sqltypes.py
tiangolo Nov 17, 2023
8672bfa
♻️ Refactor generation of expression.py with template
tiangolo Nov 17, 2023
b433b7d
✨ Update Session types and logic, add deprecations for discouraged me…
tiangolo Nov 17, 2023
4ada203
✨ Update import and export locations
tiangolo Nov 17, 2023
aa27b2b
🔧 Update mypy config for docs_src
tiangolo Nov 17, 2023
baa5e3a
⬆️ Update SQLAlchemy dependency pin
tiangolo Nov 17, 2023
80a5c52
✨ Update AsyncSession with support for SQLAlchemy 2.0 and new Session
tiangolo Nov 17, 2023
61f6a1f
✨ Add some new re-exported objects from SQLAlchemy
tiangolo Nov 18, 2023
7e9971d
♻️ Update type annotations of expression.py to support old Pythons
tiangolo Nov 18, 2023
62327ce
⬆️ Upgrade FastAPI and HTTPX dependency for tests
tiangolo Nov 18, 2023
40beca9
Merge branch 'main' into sa2-a
tiangolo Nov 18, 2023
be5277e
🔇 Do not run mypy on Python 3.7 as it behaves differently
tiangolo Nov 18, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@ jobs:
if: steps.cache.outputs.cache-hit != 'true'
run: python -m poetry install
- name: Lint
# Do not run on Python 3.7 as mypy behaves differently
if: matrix.python-version != '3.7'
run: python -m poetry run bash scripts/lint.sh
- run: mkdir coverage
- name: Test
Expand Down
14 changes: 10 additions & 4 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,8 @@ classifiers = [

[tool.poetry.dependencies]
python = "^3.7"
SQLAlchemy = ">=1.4.36,<2.0.0"
SQLAlchemy = ">=2.0.0,<2.1.0"
pydantic = "^1.9.0"
sqlalchemy2-stubs = {version = "*", allow-prereleases = true}

[tool.poetry.group.dev.dependencies]
pytest = "^7.0.1"
Expand All @@ -45,9 +44,10 @@ pillow = "^9.3.0"
cairosvg = "^2.5.2"
mdx-include = "^1.4.1"
coverage = {extras = ["toml"], version = ">=6.2,<8.0"}
fastapi = "^0.68.1"
requests = "^2.26.0"
fastapi = "^0.103.2"
ruff = "^0.1.2"
# For FastAPI tests
httpx = "0.24.1"

[build-system]
requires = ["poetry-core"]
Expand Down Expand Up @@ -80,6 +80,12 @@ strict = true
module = "sqlmodel.sql.expression"
warn_unused_ignores = false

[[tool.mypy.overrides]]
module = "docs_src.*"
disallow_incomplete_defs = false
disallow_untyped_defs = false
disallow_untyped_calls = false

[tool.ruff]
select = [
"E", # pycodestyle errors
Expand Down
6 changes: 3 additions & 3 deletions scripts/generate_select.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,9 @@ class Arg(BaseModel):
arg = Arg(name=f"entity_{i}", annotation=t_var)
ret_type = t_var
else:
t_type = f"_TModel_{i}"
t_var = f"Type[{t_type}]"
arg = Arg(name=f"entity_{i}", annotation=t_var)
t_type = f"_T{i}"
t_var = f"_TCCA[{t_type}]"
arg = Arg(name=f"__ent{i}", annotation=t_var)
ret_type = t_type
args.append(arg)
return_types.append(ret_type)
Expand Down
53 changes: 30 additions & 23 deletions sqlmodel/__init__.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
__version__ = "0.0.11"

# Re-export from SQLAlchemy
from sqlalchemy.engine import create_engine as create_engine
from sqlalchemy.engine import create_mock_engine as create_mock_engine
from sqlalchemy.engine import engine_from_config as engine_from_config
from sqlalchemy.inspection import inspect as inspect
from sqlalchemy.pool import QueuePool as QueuePool
from sqlalchemy.pool import StaticPool as StaticPool
from sqlalchemy.schema import BLANK_SCHEMA as BLANK_SCHEMA
from sqlalchemy.schema import DDL as DDL
from sqlalchemy.schema import CheckConstraint as CheckConstraint
Expand All @@ -21,7 +24,6 @@
from sqlalchemy.schema import PrimaryKeyConstraint as PrimaryKeyConstraint
from sqlalchemy.schema import Sequence as Sequence
from sqlalchemy.schema import Table as Table
from sqlalchemy.schema import ThreadLocalMetaData as ThreadLocalMetaData
from sqlalchemy.schema import UniqueConstraint as UniqueConstraint
from sqlalchemy.sql import LABEL_STYLE_DEFAULT as LABEL_STYLE_DEFAULT
from sqlalchemy.sql import (
Expand All @@ -32,26 +34,14 @@
LABEL_STYLE_TABLENAME_PLUS_COL as LABEL_STYLE_TABLENAME_PLUS_COL,
)
from sqlalchemy.sql import alias as alias
from sqlalchemy.sql import all_ as all_
from sqlalchemy.sql import and_ as and_
from sqlalchemy.sql import any_ as any_
from sqlalchemy.sql import asc as asc
from sqlalchemy.sql import between as between
from sqlalchemy.sql import bindparam as bindparam
from sqlalchemy.sql import case as case
from sqlalchemy.sql import cast as cast
from sqlalchemy.sql import collate as collate
from sqlalchemy.sql import column as column
from sqlalchemy.sql import delete as delete
from sqlalchemy.sql import desc as desc
from sqlalchemy.sql import distinct as distinct
from sqlalchemy.sql import except_ as except_
from sqlalchemy.sql import except_all as except_all
from sqlalchemy.sql import exists as exists
from sqlalchemy.sql import extract as extract
from sqlalchemy.sql import false as false
from sqlalchemy.sql import func as func
from sqlalchemy.sql import funcfilter as funcfilter
from sqlalchemy.sql import insert as insert
from sqlalchemy.sql import intersect as intersect
from sqlalchemy.sql import intersect_all as intersect_all
Expand All @@ -61,28 +51,19 @@
from sqlalchemy.sql import literal as literal
from sqlalchemy.sql import literal_column as literal_column
from sqlalchemy.sql import modifier as modifier
from sqlalchemy.sql import not_ as not_
from sqlalchemy.sql import null as null
from sqlalchemy.sql import nulls_first as nulls_first
from sqlalchemy.sql import nulls_last as nulls_last
from sqlalchemy.sql import nullsfirst as nullsfirst
from sqlalchemy.sql import nullslast as nullslast
from sqlalchemy.sql import or_ as or_
from sqlalchemy.sql import outerjoin as outerjoin
from sqlalchemy.sql import outparam as outparam
from sqlalchemy.sql import over as over
from sqlalchemy.sql import subquery as subquery
from sqlalchemy.sql import table as table
from sqlalchemy.sql import tablesample as tablesample
from sqlalchemy.sql import text as text
from sqlalchemy.sql import true as true
from sqlalchemy.sql import tuple_ as tuple_
from sqlalchemy.sql import type_coerce as type_coerce
from sqlalchemy.sql import union as union
from sqlalchemy.sql import union_all as union_all
from sqlalchemy.sql import update as update
from sqlalchemy.sql import values as values
from sqlalchemy.sql import within_group as within_group
from sqlalchemy.types import ARRAY as ARRAY
from sqlalchemy.types import BIGINT as BIGINT
from sqlalchemy.types import BINARY as BINARY
Expand All @@ -93,6 +74,8 @@
from sqlalchemy.types import DATE as DATE
from sqlalchemy.types import DATETIME as DATETIME
from sqlalchemy.types import DECIMAL as DECIMAL
from sqlalchemy.types import DOUBLE as DOUBLE
from sqlalchemy.types import DOUBLE_PRECISION as DOUBLE_PRECISION
from sqlalchemy.types import FLOAT as FLOAT
from sqlalchemy.types import INT as INT
from sqlalchemy.types import INTEGER as INTEGER
Expand All @@ -105,12 +88,14 @@
from sqlalchemy.types import TEXT as TEXT
from sqlalchemy.types import TIME as TIME
from sqlalchemy.types import TIMESTAMP as TIMESTAMP
from sqlalchemy.types import UUID as UUID
from sqlalchemy.types import VARBINARY as VARBINARY
from sqlalchemy.types import VARCHAR as VARCHAR
from sqlalchemy.types import BigInteger as BigInteger
from sqlalchemy.types import Boolean as Boolean
from sqlalchemy.types import Date as Date
from sqlalchemy.types import DateTime as DateTime
from sqlalchemy.types import Double as Double
from sqlalchemy.types import Enum as Enum
from sqlalchemy.types import Float as Float
from sqlalchemy.types import Integer as Integer
Expand All @@ -122,16 +107,38 @@
from sqlalchemy.types import String as String
from sqlalchemy.types import Text as Text
from sqlalchemy.types import Time as Time
from sqlalchemy.types import TupleType as TupleType
from sqlalchemy.types import TypeDecorator as TypeDecorator
from sqlalchemy.types import Unicode as Unicode
from sqlalchemy.types import UnicodeText as UnicodeText
from sqlalchemy.types import Uuid as Uuid

# From SQLModel, modifications of SQLAlchemy or equivalents of Pydantic
from .engine.create import create_engine as create_engine
from .main import Field as Field
from .main import Relationship as Relationship
from .main import SQLModel as SQLModel
from .orm.session import Session as Session
from .sql.expression import all_ as all_
from .sql.expression import and_ as and_
from .sql.expression import any_ as any_
from .sql.expression import asc as asc
from .sql.expression import between as between
from .sql.expression import case as case
from .sql.expression import cast as cast
from .sql.expression import col as col
from .sql.expression import collate as collate
from .sql.expression import desc as desc
from .sql.expression import distinct as distinct
from .sql.expression import extract as extract
from .sql.expression import funcfilter as funcfilter
from .sql.expression import not_ as not_
from .sql.expression import nulls_first as nulls_first
from .sql.expression import nulls_last as nulls_last
from .sql.expression import or_ as or_
from .sql.expression import over as over
from .sql.expression import select as select
from .sql.expression import tuple_ as tuple_
from .sql.expression import type_coerce as type_coerce
from .sql.expression import within_group as within_group
from .sql.sqltypes import GUID as GUID
from .sql.sqltypes import AutoString as AutoString
Empty file removed sqlmodel/engine/__init__.py
Empty file.
139 changes: 0 additions & 139 deletions sqlmodel/engine/create.py

This file was deleted.

Loading