2013-10-02 5 views
8

MySQL에서 SQLAlchemy를 사용하여 복합 기본 키가있는 테이블에 대한 테이블 매핑을 만들려고합니다. 제대로 수행하고 있는지 확실하지 않습니다. 기존 테이블은 복합 기본 키로 정의됩니다. 나는이를 추가하는 경우이 데이터베이스 A =의 표 ('테스트', '테스트', '테스트')SQLAlchemy에서 복합 기본 키를 정의하는 방법

에 이미 기록과 일치

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 

: 여기

는 매핑 클래스 정의의 세션에 추가하고 테이블에 레코드를 추가 한 다음 데이터로 작업하면 MySQL 오류 (1062 중복 항목)가 발생합니다.

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

내가 단일 키 테이블 함께 일하고 있어요, 내가 대신이 오류를 얻을 :

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

내가 잘못 복합 기본 키를 정의하는 건가요? 그렇지 않다면, 나는 더 이상 내가 Python/SQLAlchemy 오류 대신 MySQL 오류를 얻으려는 잘못을 저지르고 있는가?

+1

나는 정말로 당신이하는 것을 얻는다. 값이 이미 존재한다면 새로운 것을 만들지 말고 쿼리해야합니다 :'a = session.query (table1) .filter (table1.col1 == 'test'). filter (table1.col2 == 'test ') .one()'. 이것이 분명하지 않다면 문서에 제공된 자습서를 가져갈 것을 강력하게 제안합니다. 귀하의 질문에 대해 내가 틀렸다면, 정교하게 기재하십시오. – javex

+0

어떤 버전의 sqlalchemy를 사용하고 있습니까? –

+0

무슨 일이 일어나고 있는지에 대한 정보가 충분하지 않습니다. [최소, 완전하고 검증 가능한 예제를 만드는 방법] (http://stackoverflow.com/help/mcve) 합성 키와 비 합성 키 모두 키 서브 값을 가진 행을 추가하려고합니다. 이는 이미 테이블에 있지만 키 선언은 주어진 키 서브로 값이 테이블에 한 번만 나타날 수 있으므로 오류 메시지를 표시합니다. 필자가 작성한 것처럼,이 질문에는 TerrenceBrannon의 현상금이 있습니다. TerrenceBrannon은 자신의 상황에서 충분한 세부 정보를 제공 할 수 있도록 새로운 질문을 게시하는 것이 좋습니다. – philipxy

답변

1

나는이 질문이 모호하다는 데 동의합니다. 하지만 다음을 지침으로 사용할 수 있습니다. MySQL의 test 데이터베이스에있는 테이블 trial1에서 선택합니다. 기본 키 제약 조건을 설정하는 대체 방법으로 주석 처리 된 부분이 있습니다.

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) 
관련 문제