Поле CHAR
Поле CHAR создает столбец для хранения
строк фиксированной длины. Первым параметром
передается максимальное количество символов.
В отличие от VARCHAR, значения короче
заданной длины дополняются пробелами до
нужного размера. Тип соответствует SQL-типу
CHAR.
Синтаксис
CHAR(length, [collation])
Пример
Давайте создадим таблицу с полем CHAR
и вставим в нее строку:
from sqlalchemy import create_engine, CHAR, Integer, select
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(Integer, primary_key=True)
status: Mapped[str] = mapped_column(CHAR(5))
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(status='new')
session.add(article)
session.commit()
res = session.execute(select(Article.status)).scalar_one()
print(repr(res))
Результат выполнения кода:
'new '
Пример
Давайте посмотрим, какой SQL-запрос генерирует
тип CHAR при создании таблицы:
from sqlalchemy import create_engine, CHAR, Integer
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
from sqlalchemy.schema import CreateTable
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(Integer, primary_key=True)
status: Mapped[str] = mapped_column(CHAR(10))
engine = create_engine('sqlite:///:memory:')
print(CreateTable(Article.__table__).compile(engine))
Итоговый SQL запрос:
CREATE TABLE articles (
id INTEGER NOT NULL,
status CHAR(10),
PRIMARY KEY (id)
)
Пример
Давайте сравним поведение CHAR и
VARCHAR при хранении коротких значений:
from sqlalchemy import create_engine, CHAR, VARCHAR, Integer, select
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(Integer, primary_key=True)
code_char: Mapped[str] = mapped_column(CHAR(8))
code_varchar: Mapped[str] = mapped_column(VARCHAR(8))
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(code_char='ab', code_varchar='ab')
session.add(article)
session.commit()
res = session.execute(
select(Article.code_char, Article.code_varchar)
).one()
print(repr(res.code_char))
print(repr(res.code_varchar))
Результат выполнения кода:
'ab '
'ab'