mirror of
https://github.com/fastapi/sqlmodel.git
synced 2026-03-13 09:29:54 +08:00
Add "String fields and column length" sections to docs
This commit is contained in:
56
docs/tutorial/str-fields-and-column-length.md
Normal file
56
docs/tutorial/str-fields-and-column-length.md
Normal file
@@ -0,0 +1,56 @@
|
||||
# String fields and column length
|
||||
|
||||
Some databases have a limit on the length of string columns (e.g., `VARCHAR(255)` in *MySQL*) and fail with an error if you try to create a string column without specifying a length.
|
||||
|
||||
**SQLModel** handles this automatically depending on the database dialect you are using. 😎
|
||||
|
||||
For databases that require a length for string columns, **SQLModel** will automatically set a default length (e.g., `255` for *MySQL*) if you do not specify one.
|
||||
|
||||
{* ./docs_src/tutorial/str_fields_and_column_length/tutorial001_py310.py ln[4:6] hl[6] *}
|
||||
|
||||
If you run this code with *MySQL*, **SQLModel** will create the `name` column as `VARCHAR(255)`:
|
||||
|
||||
```sql
|
||||
CREATE TABLE hero (
|
||||
id INTEGER NOT NULL AUTO_INCREMENT,
|
||||
name VARCHAR(255) NOT NULL,
|
||||
PRIMARY KEY (id)
|
||||
)
|
||||
```
|
||||
|
||||
But you can always specify a custom length if needed:
|
||||
|
||||
{* ./docs_src/tutorial/str_fields_and_column_length/tutorial002_py310.py ln[4:6] hl[6] *}
|
||||
|
||||
```sql
|
||||
CREATE TABLE hero (
|
||||
id INTEGER NOT NULL AUTO_INCREMENT,
|
||||
name VARCHAR(100) NOT NULL,
|
||||
PRIMARY KEY (id)
|
||||
)
|
||||
```
|
||||
This works thanks to `AutoString` type that **SQLModel** uses for all string fields by default.
|
||||
|
||||
But if you specify the database type of column explicitly, **SQLModel** will not be able to set the length automatically, and you will need to specify it manually:
|
||||
|
||||
{* ./docs_src/tutorial/str_fields_and_column_length/tutorial003_py310.py ln[1:6] hl[1,6] *}
|
||||
|
||||
The code example above will fail on databases that require a length for string columns:
|
||||
|
||||
```console
|
||||
sqlalchemy.exc.CompileError: (in table 'hero', column 'name'): VARCHAR requires a length on dialect mysql
|
||||
```
|
||||
|
||||
To fix it, you need to specify the length explicitly as follows:
|
||||
|
||||
{* ./docs_src/tutorial/str_fields_and_column_length/tutorial004_py310.py ln[1:6] hl[1,6] *}
|
||||
|
||||
This will give:
|
||||
|
||||
```sql
|
||||
CREATE TABLE hero (
|
||||
id INTEGER NOT NULL AUTO_INCREMENT,
|
||||
name VARCHAR(255) NOT NULL,
|
||||
PRIMARY KEY (id)
|
||||
)
|
||||
```
|
||||
@@ -0,0 +1,19 @@
|
||||
from sqlmodel import Field, SQLModel, create_engine
|
||||
|
||||
|
||||
class Hero(SQLModel, table=True):
|
||||
id: int | None = Field(default=None, primary_key=True)
|
||||
name: str
|
||||
|
||||
|
||||
database_url = "mysql://user:password@localhost/dbname"
|
||||
|
||||
engine = create_engine(database_url, echo=True)
|
||||
|
||||
|
||||
def create_db_and_tables():
|
||||
SQLModel.metadata.create_all(engine)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
create_db_and_tables()
|
||||
@@ -0,0 +1,21 @@
|
||||
from typing import Optional
|
||||
|
||||
from sqlmodel import Field, SQLModel, create_engine
|
||||
|
||||
|
||||
class Hero(SQLModel, table=True):
|
||||
id: Optional[int] = Field(default=None, primary_key=True)
|
||||
name: str
|
||||
|
||||
|
||||
database_url = "mysql://user:password@localhost/dbname"
|
||||
|
||||
engine = create_engine(database_url, echo=True)
|
||||
|
||||
|
||||
def create_db_and_tables():
|
||||
SQLModel.metadata.create_all(engine)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
create_db_and_tables()
|
||||
@@ -0,0 +1,19 @@
|
||||
from sqlmodel import Field, SQLModel, create_engine
|
||||
|
||||
|
||||
class Hero(SQLModel, table=True):
|
||||
id: int | None = Field(default=None, primary_key=True)
|
||||
name: str = Field(max_length=100)
|
||||
|
||||
|
||||
database_url = "mysql://user:password@localhost/dbname"
|
||||
|
||||
engine = create_engine(database_url, echo=True)
|
||||
|
||||
|
||||
def create_db_and_tables():
|
||||
SQLModel.metadata.create_all(engine)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
create_db_and_tables()
|
||||
@@ -0,0 +1,21 @@
|
||||
from typing import Optional
|
||||
|
||||
from sqlmodel import Field, SQLModel, create_engine
|
||||
|
||||
|
||||
class Hero(SQLModel, table=True):
|
||||
id: Optional[int] = Field(default=None, primary_key=True)
|
||||
name: str = Field(max_length=100)
|
||||
|
||||
|
||||
database_url = "mysql://user:password@localhost/dbname"
|
||||
|
||||
engine = create_engine(database_url, echo=True)
|
||||
|
||||
|
||||
def create_db_and_tables():
|
||||
SQLModel.metadata.create_all(engine)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
create_db_and_tables()
|
||||
@@ -0,0 +1,19 @@
|
||||
from sqlmodel import Field, SQLModel, String, create_engine
|
||||
|
||||
|
||||
class Hero(SQLModel, table=True):
|
||||
id: int | None = Field(default=None, primary_key=True)
|
||||
name: str = Field(sa_type=String)
|
||||
|
||||
|
||||
database_url = "mysql://user:password@localhost/dbname"
|
||||
|
||||
engine = create_engine(database_url, echo=True)
|
||||
|
||||
|
||||
def create_db_and_tables():
|
||||
SQLModel.metadata.create_all(engine)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
create_db_and_tables()
|
||||
@@ -0,0 +1,21 @@
|
||||
from typing import Optional
|
||||
|
||||
from sqlmodel import Field, SQLModel, String, create_engine
|
||||
|
||||
|
||||
class Hero(SQLModel, table=True):
|
||||
id: Optional[int] = Field(default=None, primary_key=True)
|
||||
name: str = Field(sa_type=String)
|
||||
|
||||
|
||||
database_url = "mysql://user:password@localhost/dbname"
|
||||
|
||||
engine = create_engine(database_url, echo=True)
|
||||
|
||||
|
||||
def create_db_and_tables():
|
||||
SQLModel.metadata.create_all(engine)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
create_db_and_tables()
|
||||
@@ -0,0 +1,19 @@
|
||||
from sqlmodel import Field, SQLModel, String, create_engine
|
||||
|
||||
|
||||
class Hero(SQLModel, table=True):
|
||||
id: int | None = Field(default=None, primary_key=True)
|
||||
name: str = Field(sa_type=String(length=255))
|
||||
|
||||
|
||||
database_url = "mysql://user:password@localhost/dbname"
|
||||
|
||||
engine = create_engine(database_url, echo=True)
|
||||
|
||||
|
||||
def create_db_and_tables():
|
||||
SQLModel.metadata.create_all(engine)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
create_db_and_tables()
|
||||
@@ -0,0 +1,21 @@
|
||||
from typing import Optional
|
||||
|
||||
from sqlmodel import Field, SQLModel, String, create_engine
|
||||
|
||||
|
||||
class Hero(SQLModel, table=True):
|
||||
id: Optional[int] = Field(default=None, primary_key=True)
|
||||
name: str = Field(sa_type=String(length=255))
|
||||
|
||||
|
||||
database_url = "mysql://user:password@localhost/dbname"
|
||||
|
||||
engine = create_engine(database_url, echo=True)
|
||||
|
||||
|
||||
def create_db_and_tables():
|
||||
SQLModel.metadata.create_all(engine)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
create_db_and_tables()
|
||||
@@ -81,6 +81,7 @@ nav:
|
||||
- tutorial/create-db-and-table.md
|
||||
- tutorial/insert.md
|
||||
- tutorial/automatic-id-none-refresh.md
|
||||
- tutorial/str-fields-and-column-length.md
|
||||
- tutorial/select.md
|
||||
- tutorial/where.md
|
||||
- tutorial/indexes.md
|
||||
|
||||
Reference in New Issue
Block a user