blob: d87165fea27477d94ee9e67231cc146663534e4c (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
from typing import Optional
from sqlalchemy import Column
from sqlalchemy import Integer
from sqlalchemy import String
from sqlalchemy.orm import column_property
from sqlalchemy.orm import deferred
from sqlalchemy.orm import registry
from sqlalchemy.orm import Session
from sqlalchemy.orm import synonym
from sqlalchemy.sql.functions import func
from sqlalchemy.sql.sqltypes import Text
reg: registry = registry()
@reg.mapped
class User:
__tablename__ = "user"
id = Column(Integer(), primary_key=True)
name = Column(String)
# this gets inferred
big_col = deferred(Column(Text))
# this gets inferred
explicit_col = column_property(Column(Integer))
# EXPECTED: Can't infer type from ORM mapped expression assigned to attribute 'lower_name'; # noqa
lower_name = column_property(func.lower(name))
# EXPECTED: Can't infer type from ORM mapped expression assigned to attribute 'syn_name'; # noqa
syn_name = synonym("name")
# this uses our type
lower_name_exp: str = column_property(func.lower(name))
# this uses our type
syn_name_exp: Optional[str] = synonym("name")
s = Session()
u1: Optional[User] = s.get(User, 5)
assert u1
q1: Optional[str] = u1.big_col
q2: Optional[int] = u1.explicit_col
# EXPECTED_MYPY: Incompatible types in assignment (expression has type "str", variable has type "int") # noqa
x: int = u1.lower_name_exp
# EXPECTED_MYPY: Incompatible types in assignment (expression has type "Optional[str]", variable has type "int") # noqa
y: int = u1.syn_name_exp
|