Тип DOUBLE_PRECISION
Тип DOUBLE_PRECISION представляет
число с плавающей точкой двойной точности
в базе данных. Он соответствует SQL-типу
DOUBLE PRECISION и обычно занимает
8 байт, обеспечивая точность примерно
15 знаков после запятой. Тип применяется
для хранения вещественных чисел, когда
нужна повышенная точность по сравнению
с обычным FLOAT.
Тип DOUBLE_PRECISION не принимает
обязательных параметров. При необходимости
можно указать precision, но в
большинстве СУБД этот параметр игнорируется,
поскольку двойная точность фиксирована.
Синтаксис
from sqlalchemy import DOUBLE_PRECISION
column = DOUBLE_PRECISION()
Пример
Давайте создадим таблицу с колонкой типа
DOUBLE_PRECISION и вставим в неё
значение:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, DOUBLE_PRECISION
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles',
metadata,
Column('id', Integer, primary_key=True),
Column('num', DOUBLE_PRECISION),
)
metadata.create_all(engine)
with engine.connect() as conn:
conn.execute(articles.insert().values(id=1, num=3.141592653589793))
res = conn.execute(articles.select()).fetchall()
print(res)
Результат выполнения кода:
[(1, 3.141592653589793)]
Пример
Давайте посмотрим, какой SQL-тип генерируется для разных диалектов:
from sqlalchemy import DOUBLE_PRECISION
from sqlalchemy.dialects import postgresql, mysql, sqlite
column_type = DOUBLE_PRECISION()
print(column_type.compile(dialect=postgresql.dialect()))
print(column_type.compile(dialect=mysql.dialect()))
print(column_type.compile(dialect=sqlite.dialect()))
Результат выполнения кода:
"DOUBLE PRECISION"
"DOUBLE"
"FLOAT"
Пример
Давайте используем тип в декларативной модели:
from sqlalchemy import DOUBLE_PRECISION
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
num: Mapped[float] = mapped_column(DOUBLE_PRECISION)
Теперь создадим таблицу и добавим запись:
from sqlalchemy import create_engine
from sqlalchemy.orm import Session
from models import Base, Article
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(title='article', num=2.718281828459045)
session.add(article)
session.commit()
res = session.query(Article).all()
for row in res:
print(row.id, row.title, row.num)
Результат выполнения кода:
"1 article 2.718281828459045"