2013-10-02 19 views
8

'da bileşik birincil anahtar nasıl tanımlanır SQLAlchemy'i birleşik bir birincil anahtarla bir tablo için bir tablo eşlemesi oluşturmak için SQLSlchemy ile kullanmaya çalışıyorum ve doğru yaptığımdan emin değilim. Mevcut tablo, bileşik birincil anahtarla tanımlanır. Bunu eklersek bu veritabanından a = tablo1 ('Test', 'Test', 'test')SQLAlchemy

zaten bir rekor maçları

class table1(Base): 
    __tablename__ = 'table1' 

    col1 = Column(String, primary_key=True) 
    col2 = Column(String, primary_key=True) 
    col3 = Column(String) 

    def __init__ = (self, col1, col2, col3): 
     self.col1 = col1 
     self.col2 = col2 
     self.col3 = col3 

: Burada

haritalama sınıf tanımı var oturuma ve kayıtları tabloya ekledikten sonra verilerle çalışarak bir MySQL hatası alıyorum (1062 Duplicate Entry).

session.add(a) 
b = session.query(table1) 
for instance in b: 
    print(instance.col1, instance.col2) 

Ben tek tuşlu masaya ile çalışıyorum, ben onun yerine bu hatayı alıyorum:

New instance <table2 at 0x2f204d0> with identity key 
(<class '__main__.table2'>,('test',)) conflicts with 
persistent instance <table2 at 0x2f88770> 

ben yanlış kompozit birincil anahtar tanımlama muyum? Değilse, bir Python/SQLAlchemy hatası yerine MySQL hatasını almam için neyi yanlış yapıyorum?

+1

Gerçekten emin değilim, yaptığınız şeyi alıyorum. Değer zaten varsa, bunun için sorgulamanız gerekir, yeni bir tane oluşturmayın: 'a = session.query (table1) .filter (table1.col1 == 'test'). Filter (table1.col2 == 'test ') .one()'. Bu size * açık değilse * o zaman belgelere verilen dersleri almanızı şiddetle tavsiye ederim. Sorunuz hakkında yanılıyorsam, lütfen ayrıntılandırın. – javex

+0

sqlalchemy hangi sürümünü kullanıyorsunuz? –

+0

Neler olup bittiği hakkında yeterli bilgi yok. [Minimal, Tam ve Doğrulanabilir bir örnek nasıl oluşturulur?] (Http://stackoverflow.com/help/mcve) Hem kompozit hem de bileşik olmayan anahtarlarda, anahtar subrow değerine sahip bir satır eklemeyi denediğiniz görülüyor. Bu zaten bir tabloda yer almaktadır, ancak anahtar beyanı, belirli bir anahtar alt değer değerinin yalnızca bir tabloda bir kez görülebildiğini, dolayısıyla hata mesajlarının göründüğünü belirtmektedir. Yazdığım gibi, bu sorunun TerrenceBrannon'dan, kendi durumlarından yeterli ayrıntılar verebilmeleri için yeni bir soru yayınlamaktan daha iyi olabilecek bir lütuf vardır. – philipxy

cevap

1

Sorunun muğlak olduğunu kabul ediyorum. Ancak aşağıdakileri bir kılavuz olarak kullanabilirsiniz. Bu MySQL içinde bir test veritabanında bir trial1 tablosundan seçecektir. Yorumlanan bölümler, birincil anahtar kısıtlamalarını kurmak için alternatif bir yoldur.

from sqlalchemy import String, create_engine, MetaData, Column 
from sqlalchemy.ext.declarative import declarative_base 
# from sqlalchemy.schema import PrimaryKeyConstraint 
from sqlalchemy.orm import sessionmaker 

engine = create_engine('mysql+pymysql://root:[email protected]/test') 
metadata = MetaData(bind=engine) 
Base = declarative_base(metadata=metadata) 


class TableClassName(Base): 
    __tablename__ = 'table1' 

    col1 = Column(String, primary_key=True) 
    col2 = Column(String, primary_key=True) 
    col3 = Column(String) 

    # __table_args__ = (
    #  PrimaryKeyConstraint(
    #   col1, 
    #   col2), 
    #  {}) 

Session = sessionmaker(bind=engine) 
session = Session() 

b = session.query(TableClassName) 
for instance in b: 
    print(instance.col1, instance.col2)