Обработка столбцов идентичности Redshift в SQLAlchemy

Я использую пакет redshift-sqlalchemy для подключения SQLAlchemy к Redshift. В Redshift у меня есть простая таблица "компании":

create table if not exists companies (
    id bigint identity primary key,
    name varchar(1024) not null
);

На стороне SQLAlchemy я отобразил ее так:

Base = declarative_base()
class Company(Base):
    __tablename__ = 'companies'
    id = Column(BigInteger, primary_key=True)
    name = Column(String)

Если я попытаюсь создать компанию:

company = Company(name = 'Acme')
session.add(company)
session.commit()

то я получаю эту ошибку:

sqlalchemy.exc.StatementError: (raised as a result of Query-invoked autoflush; 
consider using a session.no_autoflush block if this flush is occurring prematurely) 
(sqlalchemy.exc.ProgrammingError) (psycopg2.ProgrammingError) 
relation "companies_id_seq" does not exist
[SQL: 'select nextval(\'"companies_id_seq"\')'] 
[SQL: u'INSERT INTO companies (id, name) 
VALUES (%(id)s, %(name)s)'] [parameters: [{'name': 'Acme'}]]

Проблема заключается в том, что SQLAlchemy ожидает автоматическую инкрементную последовательность - стандартную технику с Postgres и другими обычными БД. Но Redshift не имеет последовательностей, вместо этого он предлагает "столбцы идентификации" для автоматически генерируемых уникальных значений (не обязательно последовательных). Любые советы о том, как сделать эту работу? Чтобы быть ясным, меня не интересует автоматическое увеличение, просто нужны уникальные значения первичного ключа.

Ответы

Ответ 1

Как и вы сказали, Redshift не поддерживает последовательности, поэтому вы можете удалить эту часть:

select nextval(\'"companies_id_seq"\')

И ваш оператор insert просто должен быть:

INSERT INTO companies 
(name)
VALUES
('Acme')

В вашей таблице вы увидите, что "Acme" имеет столбец id с уникальным значением. Вы не можете вставить значение в столбец id, чтобы не указывать его в инструкции insert. Он будет автоматически заполнен.

Вот еще объяснение:

http://docs.aws.amazon.com/redshift/latest/dg/c_Examples_of_INSERT_30.html