@@ -4,6 +4,93 @@ Tools to generate Pydantic models from SQLAlchemy models.
4
4
5
5
Still experimental.
6
6
7
+ ## How to use
8
+
9
+ Quick example:
10
+
11
+ ``` Python
12
+ from typing import List
13
+
14
+ from pydantic_sqlalchemy import sqlalchemy_to_pydantic
15
+ from sqlalchemy import Column, ForeignKey, Integer, String, create_engine
16
+ from sqlalchemy.ext.declarative import declarative_base
17
+ from sqlalchemy.orm import Session, relationship, sessionmaker
18
+
19
+ Base = declarative_base()
20
+
21
+ engine = create_engine(" sqlite://" , echo = True )
22
+
23
+
24
+ class User (Base ):
25
+ __tablename__ = " users"
26
+
27
+ id = Column(Integer, primary_key = True )
28
+ name = Column(String)
29
+ fullname = Column(String)
30
+ nickname = Column(String)
31
+
32
+ addresses = relationship(
33
+ " Address" , back_populates = " user" , cascade = " all, delete, delete-orphan"
34
+ )
35
+
36
+
37
+ class Address (Base ):
38
+ __tablename__ = " addresses"
39
+ id = Column(Integer, primary_key = True )
40
+ email_address = Column(String, nullable = False )
41
+ user_id = Column(Integer, ForeignKey(" users.id" ))
42
+
43
+ user = relationship(" User" , back_populates = " addresses" )
44
+
45
+
46
+ PydanticUser = sqlalchemy_to_pydantic(User)
47
+ PydanticAddress = sqlalchemy_to_pydantic(Address)
48
+
49
+
50
+ class PydanticUserWithAddresses (PydanticUser ):
51
+ addresses: List[PydanticAddress] = []
52
+
53
+
54
+ Base.metadata.create_all(engine)
55
+
56
+
57
+ LocalSession = sessionmaker(bind = engine)
58
+
59
+ db: Session = LocalSession()
60
+
61
+ ed_user = User(name = " ed" , fullname = " Ed Jones" , nickname = " edsnickname" )
62
+
63
+ address = Address(email_address = " ed@example.com" )
64
+ address2 = Address(email_address = " eddy@example.com" )
65
+ ed_user.addresses = [address, address2]
66
+ db.add(ed_user)
67
+ db.commit()
68
+
69
+
70
+ def test_pydantic_sqlalchemy ():
71
+ user = db.query(User).first()
72
+ pydantic_user = PydanticUser.from_orm(user)
73
+ data = pydantic_user.dict()
74
+ assert data == {
75
+ " fullname" : " Ed Jones" ,
76
+ " id" : 1 ,
77
+ " name" : " ed" ,
78
+ " nickname" : " edsnickname" ,
79
+ }
80
+ pydantic_user_with_addresses = PydanticUserWithAddresses.from_orm(user)
81
+ data = pydantic_user_with_addresses.dict()
82
+ assert data == {
83
+ " fullname" : " Ed Jones" ,
84
+ " id" : 1 ,
85
+ " name" : " ed" ,
86
+ " nickname" : " edsnickname" ,
87
+ " addresses" : [
88
+ {" email_address" : " ed@example.com" , " id" : 1 , " user_id" : 1 },
89
+ {" email_address" : " eddy@example.com" , " id" : 2 , " user_id" : 1 },
90
+ ],
91
+ }
92
+ ```
93
+
7
94
## License
8
95
9
96
This project is licensed under the terms of the MIT license.
0 commit comments