Обработка столбцов идентичности 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