Пилоны, SQlite и автоинкрементные поля - PullRequest
7 голосов
/ 31 декабря 2010

Эй!Я только начал работать с Pylons в сочетании с SQLAlchemy, и моя модель выглядит примерно так:

from sqlalchemy import Column
from sqlalchemy.types import Integer, String

from helloworld.model.meta import Base

class Person(Base):
    __tablename__ = "person"

    id = Column(Integer, primary_key=True)
    name = Column(String(100))
    email = Column(String(100))

    def __init__(self, name='', email=''):
        self.name = name
        self.email = email

    def __repr__(self):
        return "<Person('%s')" % self.name

Чтобы избежать повторного использования идентификаторов sqlite, которые могли быть удалены, я хочу добавить AUTOINCREMENT в столбец «id».Я просмотрел документацию по sqlalchemy и увидел, что sqlite_autoincrement может быть выдан.Пример, где указан этот атрибут, можно найти здесь .

sqlite_autoincrement, похоже, создается при создании самой таблицы, и я просто удивился, как ее можно использовать при использовании декларативного стилямодели, такой как моя.

1 Ответ

19 голосов
/ 31 декабря 2010

Попробуйте включить атрибут __table_args__ с аргументами, которые вы передадите конструкторам Table в традиционном (не декларативном) стиле определения данных, например:

class Person(Base):
    __tablename__ = "person"
    __table_args__ = {'sqlite_autoincrement': True}

Если вам нужно включить несколькоаргументы, используйте эту форму вместо (dict должен быть последним):

__table_args__ = (
    Unique('foo'),
    # ...
    {'sqlite_autoincrement': True}
)

Из раздела Конфигурация таблицы в документации декларативной SQLAlchemy:

Таблицааргументы, отличные от имени, метаданных и сопоставленных аргументов Column, задаются с помощью атрибута класса __table_args__.Этот атрибут вмещает как позиционные, так и ключевые аргументы, которые обычно отправляются в конструктор Table.

...