2015-07-01 27 views
14

'daki Redshift kimlik sütunlarını işleme SQLAlchemy'ı Redshift'e bağlamak için redshift-sqlalchemy paketini kullanıyorum.SQLAlchemy

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

Öyle gibi eşlenen SQLAlchemy tarafında: Redshift ben tablo basit bir "şirketleri" var

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

Bir şirketi oluşturmayı denerseniz:

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

sonra bu hatayı alıyorum:

Sorun şu ki, SQLAlchemy otomatik bir artış dizisi beklemektedir - Postgres ve diğer geleneksel DB'ler ile standart bir teknik. Fakat Redshift'in dizileri yoktur, bunun yerine otomatik olarak oluşturulmuş benzersiz değerler (zorunlu olarak değil) için "kimlik sütunları" sunar. Bu işin nasıl yapıldığına dair herhangi bir tavsiye var mı? Net olmak gerekirse, otomatik artırmayı umursamıyorum, sadece benzersiz birincil anahtar değerlere ihtiyacınız var. olacak, senin tabloda

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

: basitçe olmalıdır

select nextval(\'"companies_id_seq"\') 

Ve ekleme deyimini:

+0

İlgili tartışma burada

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

: https://github.com/binarydud/redshift_sqlalchemy/issues/24 bir düzeltme Talepleri, ancak bir düzeltme olduğunu bana görünen İlgili ama farklı bir hata, yani tablo oluşturma, ORM üzerinden yeni bir giriş eklemek yerine, –

cevap

2

Eğer bu kısmı kaldırmak böylece Redshift dizileri desteklemez, dediğimiz gibi 'Acme' nin benzersiz bir değere sahip bir kimlik sütununa sahip olduğunu görün. Kimlik sütununa değer ekleyemezsiniz, böylece ekleme ifadesinde belirtmezsiniz. Otomatik doldurulur. İşte

daha açıklama şudur:

+0

hakkında endişeliyim. Yanıt vermek için zaman ayırdığınız için teşekkür ederiz. Sonuç olarak, tavsiyeniz SQL'i doğrudan yürütmek ve SQLAlchemy'nin sağladığı soyutlama katmanını atlamaktır. Bu bir utanç, ancak sorunu çözmek için tek yol olabilir. –