Skip to content

Commit

Permalink
support EmailStr
Browse files Browse the repository at this point in the history
  • Loading branch information
honglei committed Sep 4, 2023
1 parent 4213c97 commit 8b92179
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 2 deletions.
7 changes: 5 additions & 2 deletions sqlmodel/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,8 @@
)

import pydantic
from pydantic import BaseModel
from annotated_types import MaxLen
from pydantic import BaseModel, EmailStr, ImportString, NameEmail
from pydantic._internal._fields import PydanticGeneralMetadata
from pydantic._internal._model_construction import ModelMetaclass
from pydantic._internal._repr import Representation
Expand Down Expand Up @@ -480,7 +481,7 @@ def get_sqlalchemy_type(field: FieldInfo) -> Any:
metadata = _get_field_metadata(field)
if type_ is None:
raise ValueError("Missing field type")
if issubclass(type_, str):
if issubclass(type_, str) or type_ in (EmailStr, NameEmail, ImportString):
max_length = getattr(metadata, "max_length", None)
if max_length:
return AutoString(length=max_length)
Expand Down Expand Up @@ -693,4 +694,6 @@ def _get_field_metadata(field: FieldInfo) -> object:
for meta in field.metadata:
if isinstance(meta, PydanticGeneralMetadata):
return meta
if isinstance(meta, MaxLen):
return meta
return object()
24 changes: 24 additions & 0 deletions tests/test_pydantic_types.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
from pydantic import EmailStr, HttpUrl, ImportString, NameEmail
from sqlmodel import Field, SQLModel, create_engine


def test_pydantic_types(clear_sqlmodel, caplog):
class Hero(SQLModel, table=True):
integer_primary_key: int = Field(
primary_key=True,
)
http: HttpUrl = Field(max_length=250)
email: EmailStr
name_email: NameEmail = Field(max_length=50)
import_string: ImportString = Field(max_length=200, min_length=100)

engine = create_engine("sqlite://", echo=True)
SQLModel.metadata.create_all(engine)

create_table_log = [
message for message in caplog.messages if "CREATE TABLE hero" in message
][0]
assert "http VARCHAR(250) NOT NULL," in create_table_log
assert "email VARCHAR NOT NULL," in create_table_log
assert "name_email VARCHAR(50) NOT NULL," in create_table_log
assert "import_string VARCHAR(200) NOT NULL," in create_table_log

0 comments on commit 8b92179

Please sign in to comment.