我正在尝试使用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 = table1('test','test','test')
如果我将此添加到会话并在表中添加记录,然后使用数据,我收到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>
我是否错误地定义了复合主键?如果没有,我为什么要进一步错误地得到MySQL错误而不是Python / SQLAlchemy错误?
答案 0 :(得分:3)
我同意这个问题很模糊。但您可以使用以下内容作为指导。这将从MySQL中trial1
数据库中的test
表中进行选择。注释掉的部分作为设置主键约束的替代方法。
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)