简体   繁体   English

如何在SQLAlchemy中定义复合主键

[英]How to define composite primary key in SQLAlchemy

I'm trying to use SQLAlchemy with MySQL to create a table mapping for a table with a composite primary key, and I'm unsure if I'm doing it right. 我正在尝试使用SQLAlchemy和MySQL为具有复合主键的表创建表映射,我不确定我是否正确行事。 The existing table is defined with the composite primary key. 使用复合主键定义现有表。

Here's the mapping class definition: 这是映射类定义:

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

this matches a record already in the database a = table1('test', 'test', 'test') 这匹配数据库中已有的记录a = table1('test','test','test')

If I add this to the session and add the records in the table, then work with the data, I get a MySQL error (1062 Duplicate Entry). 如果我将此添加到会话并在表中添加记录,然后使用数据,我得到MySQL错误(1062重复条目)。

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

If I'm working with a single-key table, I get this error instead: 如果我正在使用单键表,我会收到此错误:

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

Am I defining the composite primary key incorrectly? 我是否错误地定义了复合主键? If not, what am I doing wrong further down for me to get the MySQL error instead of a Python/SQLAlchemy error? 如果没有,我为什么要进一步错误地得到MySQL错误而不是Python / SQLAlchemy错误?

I agree that the question is vague. 我同意这个问题含糊不清。 But you can use the following as a guideline. 但您可以使用以下内容作为指导。 This will select from a trial1 table in a test database in MySQL. 这将从MySQL中的test数据库中的trial1表中进行选择。 Commented out parts are there as an alternative way to setup primary key constraints. 注释掉的部分作为设置主键约束的替代方法。

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:root@127.0.0.1/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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM