Skip to content

Commit

Permalink
Merge pull request #3 from honglei/main
Browse files Browse the repository at this point in the history
support EmailStr
  • Loading branch information
mbsantiago authored Sep 8, 2023
2 parents bcb6f32 + 80bc2a1 commit 3005495
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 3 deletions.
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ classifiers = [
[tool.poetry.dependencies]
python = "^3.7"
SQLAlchemy = ">=2.0.0,<=2.0.11"
pydantic = "^2.1.1"
pydantic = { version = ">=2.1.1,<=2.4", extras = ["email"] }

[tool.poetry.dev-dependencies]
pytest = "^7.0.1"
Expand Down
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 3005495

Please sign in to comment.