2013-10-02 46 views
8

Tôi đang cố gắng sử dụng SQLAlchemy với MySQL để tạo một ánh xạ bảng cho một bảng có khóa chính hỗn hợp và tôi không chắc liệu tôi có làm đúng không. Bảng hiện tại được xác định bằng khóa chính kết hợp.Cách xác định khóa chính kết hợp trong SQLAlchemy

Đây là định nghĩa lớp bản đồ:

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 

này phù hợp với một kỷ lục đã có trong cơ sở dữ liệu a = table1 ('test', 'test', 'test')

Nếu tôi thêm này đến phiên và thêm các bản ghi trong bảng, sau đó làm việc với dữ liệu, tôi nhận được một lỗi MySQL (1062 Duplicate Entry).

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

Nếu tôi đang làm việc với một bảng duy nhất-key, tôi nhận được lỗi này thay vì:

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

Tôi định khóa chính tổng hợp không đúng cách? Nếu không, tôi đang làm gì sai hơn nữa cho tôi để có được lỗi MySQL thay vì một lỗi Python/SQLAlchemy?

+1

Tôi không thực sự chắc chắn, tôi có được những gì bạn đang làm. Nếu giá trị đã tồn tại, bạn cần truy vấn giá trị đó, không phải tạo giá trị mới: 'a = session.query (table1) .filter (table1.col1 == 'test') .bộ lọc (table1.col2 == 'test ') .one() '. Nếu điều này là * không * rõ ràng với bạn thì tôi khuyên bạn nên thực hiện các hướng dẫn được cung cấp trong tài liệu. Nếu tôi sai về câu hỏi của bạn, xin hãy giải thích. – javex

+0

bạn đang sử dụng phiên bản sqlalchemy nào? –

+0

Không có đủ thông tin về những gì đang diễn ra. [Làm thế nào để tạo ra một ví dụ tối thiểu, đầy đủ, và có thể xác minh được] (http://stackoverflow.com/help/mcve) Dường như với cả khóa hỗn hợp và không phải là tổng hợp, bạn đang cố thêm một hàng có giá trị subrow key đã có trong một bảng, nhưng khai báo quan trọng nói rằng một giá trị khóa con đã cho chỉ có thể xuất hiện một lần trong một bảng, do đó các thông báo lỗi. Khi tôi viết, câu hỏi này có một tiền thưởng từ TerrenceBrannon, người có thể tốt hơn khi đăng một câu hỏi mới để họ có thể cung cấp đầy đủ chi tiết từ tình huống của chính họ. – philipxy

Trả lời

1

Tôi đồng ý rằng câu hỏi này là mơ hồ. Nhưng bạn có thể sử dụng những điều sau đây làm phương châm. Điều này sẽ chọn từ một bảng trial1 trong cơ sở dữ liệu test trong MySQL. Nhận xét ra các bộ phận là có một cách khác để thiết lập các ràng buộc khóa chính.

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) 
Các vấn đề liên quan