Python 如何在SQLAlchemy中定义复合主键

Python 如何在SQLAlchemy中定义复合主键,python,sqlalchemy,composite-primary-key,Python,Sqlalchemy,Composite Primary Key,我正在尝试使用SQLAlchemy和MySQL为一个具有复合主键的表创建一个表映射,我不确定我是否做对了。现有表是用复合主键定义的 以下是映射类定义: class table1(Base): __tablename__ = 'table1' col1 = Column(String, primary_key=True) col2 = Column(String, primary_key=True) col3 = Column(String) def _

我正在尝试使用SQLAlchemy和MySQL为一个具有复合主键的表创建一个表映射,我不确定我是否做对了。现有表是用复合主键定义的

以下是映射类定义:

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
这与数据库中已有的记录相匹配 a=表1(“测试”、“测试”、“测试”)

如果我将其添加到会话中,并在表中添加记录,然后处理数据,我会得到一个MySQL错误(1062重复条目)

如果使用单键表,则会出现以下错误:

New instance <table2 at 0x2f204d0> with identity key 
(<class '__main__.table2'>,('test',)) conflicts with 
persistent instance <table2 at 0x2f88770>
具有标识密钥的新实例
(,('test',))与冲突
持久实例

我是否错误地定义了复合主键?如果不是,那么我在更深层次上犯了什么错误,导致了MySQL错误而不是Python/SQLAlchemy错误

我同意这个问题很模糊。但您可以使用以下内容作为指导。这将从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: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)

我不太确定,我明白你在做什么。如果该值已经存在,则需要查询它,而不是创建一个新值:
a=session.query(table1).filter(table1.col1=='test').filter(table1.col2=='test').one()
。如果您对此不清楚,那么我强烈建议您学习文档中提供的教程。如果我对你的问题有错误,请详细说明。你使用的是哪个版本的sqlalchemy?没有足够的信息说明正在发生什么。对于复合键和非复合键,您似乎都在尝试添加一行,该行具有表中已存在的键子程序值,但键声明表示给定的键子程序值在表中只能出现一次,因此会显示错误消息。在我写这篇文章的时候,这个问题得到了特伦斯布兰农的赏赐,他最好能提出一个新问题,这样他们就可以根据自己的情况提供足够的细节。
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)