Атрибут autoincrement
Атрибут autoincrement класса Column
указывает, должно ли значение столбца автоматически
увеличиваться при вставке новой строки. Обычно применяется
к целочисленным столбцам первичного ключа. Атрибут
принимает значение True, False или строку
'auto'. По умолчанию используется 'auto',
что означает автоматическое определение поведения СУБД.
Синтаксис
Column(autoincrement=True)
Пример
Давайте создадим таблицу с автоматическим приращением первичного ключа:
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import DeclarativeBase, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id = Column(Integer, primary_key=True, autoincrement=True)
title = Column(String)
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add_all([
Article(title='article 1'),
Article(title='article 2'),
Article(title='article 3')
])
session.commit()
res = session.query(Article.id, Article.title).all()
print(res)
Результат выполнения кода:
[(1, 'article 1'), (2, 'article 2'), (3, 'article 3')]
Пример
Давайте отключим автоматическое приращение с помощью
значения False и зададим идентификаторы вручную:
<+python+>
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import DeclarativeBase, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id = Column(Integer, primary_key=True, autoincrement=False)
title = Column(String)
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add_all([
Article(id=10, title='article 1'),
Article(id=20, title='article 2')
])
session.commit()
res = session.query(Article.id, Article.title).all()
print(res)
<-python+>
Результат выполнения кода:
[(10, 'article 1'), (20, 'article 2')]
Пример
Давайте посмотрим, какой SQL-запрос генерируется при
использовании автоинкремента. Включим вывод запросов
параметром echo:
<+python+>
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import DeclarativeBase, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id = Column(Integer, primary_key=True, autoincrement=True)
title = Column(String)
engine = create_engine('sqlite:///:memory:', echo=True)
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add(Article(title='article 1'))
session.commit()
<-python+>
Итоговый SQL запрос:
INSERT INTO articles (title) VALUES (?)
Смотрите также
-
класс
Column,
который представляет столбец таблицы -
атрибут
primary_key,
который помечает столбец как первичный ключ -
атрибут
type,
который задает тип данных столбца -
атрибут
default,
который задает значение по умолчанию для столбца