2015-07-01 9 views
14

Używam pakietu redshift-sqlalchemy do połączenia SQLAlchemy z Redshift. W redshifcie Mam proste „przedsiębiorstw” tabela:Obsługa kolumn identyfikacji Redshift w SQLAlchemy

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

Na stronie sqlalchemy mam zmapowany go tak:

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

Jeśli staram się stworzyć firmę:

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

następnie pojawia się ten błąd:

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'}]] 

Problem polega na tym, że SQLAlchemy oczekuje sekwencji automatycznej inkrementacji - standardowej techniki z Postgresem i innymi konwencjonalnymi DB. Ale Redshift nie ma sekwencji, zamiast tego oferuje "kolumny tożsamości" dla automatycznie generowanych unikatowych wartości (niekoniecznie sekwencyjnych). Wszelkie porady, jak to zrobić? Dla jasności nie zależy mi na automatycznym inkrementowaniu, potrzebuję tylko unikatowych wartości klucza podstawowego.

+0

pokrewne dyskusja tutaj: https://github.com/binarydud/redshift_sqlalchemy/issues/24 Zastrzeżenia poprawkę, ale wydaje mi się, że jest to poprawka do powiązany, ale inny błąd, a mianowicie tworzenie tabeli, a nie wstawianie nowego wpisu za pośrednictwem ORM, co jest problemem, który mnie interesuje. –

Odpowiedz

2

Tak jak pan powiedział, Redshift nie wspiera sekwencji więc można usunąć tę część:

select nextval(\'"companies_id_seq"\') 

i Twoich instrukcji insert powinny być po prostu:

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

w tabeli, to będzie zobacz, że "Acme" ma kolumnę id z unikalną wartością. Nie można wstawić wartości do kolumny id, więc nie określa się jej w instrukcji insert. Zostanie automatycznie wypełnione.

Oto bardziej wyjaśnienie:

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

+0

Dziękuję za poświęcenie czasu na odpowiedź. W związku z tym zaleca się wykonanie SQL bezpośrednio i ominięcie warstwy abstrakcji zapewnionej przez SQLAlchemy. To wstyd, ale może być jedynym sposobem na rozwiązanie problemu. –

Powiązane problemy