2017-09-11 3 views
0

Je suis en train de mettre en œuvre la table d'exemple très simple à partir d'un ancien cours maintenant SQLAlchemy ...Erreur dans la contrainte de clé étrangère avec SQLAlchemy

J'ai loin, mais quand je lance le code ...

from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy import Column, Integer, String, Date, MetaData 
from sqlalchemy import ForeignKey 
from sqlalchemy.orm import relationship 
from sqlalchemy import create_engine 

Base = declarative_base() 
engine = create_engine('mysql://x @ amazonaws.com:3306/db', echo=True) 
class Guest(Base): 
    __tablename__ = "guests" 
    guest_no = Column(String(4), primary_key=True) 
    g_name = Column(String(20)) 
    g_address = Column(String(30)) 
    booking = relationship("Booking", back_populates="guests") 
class Hotel(Base): 
    __tablename__ = "hotels" 
    hotel_no = Column(String(4), primary_key=True) 
    h_name = Column(String(20)) 
    h_address = Column(String(30)) 
    room = relationship("Room", back_populates="hotels") 
    booking = relationship("Booking", back_populates="hotels") 
class Room(Base): 
    __tablename__ = "rooms" 
    hotel_no = Column(String(4), ForeignKey('hotels.hotel_no'), primary_key=True) 
    room_no = Column(String(4), primary_key=True) 
    r_type = Column(String(1)) 
    r_price = Column(Integer) 
    hotel = relationship("Hotel", back_populates="rooms") 
    booking = relationship("Booking", back_populates="rooms") 
class Booking(Base): 
    __tablename__ = "bookings" 
    hotel_no = Column(String(4), ForeignKey('hotels.hotel_no'), primary_key=True) 
    guest_no = Column(String(4), ForeignKey('guests.guest_no'), primary_key=True) 
    date_form = Column(Date, primary_key=True) 
    date_to = Column(Date) 
    room_no = Column(String(4), ForeignKey('rooms.room_no'), primary_key=True) 
    hotel = relationship("Hotel", back_populates="bookings") 
    guest = relationship("Guest", back_populates="bookings") 
    room = relationship("Room", back_populates="bookings") 

Base.metadata.create_all(engine) 

il me donne une erreur au sujet de la room_no clé étrangère ...

2017-09-11 16:16:03 2b8010c29700 Error in foreign key constraint of table db/bookings: 
FOREIGN KEY(room_no) REFERENCES rooms (room_no) 
): 
Cannot find an index in the referenced table where the 
referenced columns appear as the first columns, or column types 
in the table and the referenced table do not match for constraint. 
Note that the internal storage type of ENUM and SET changed in 
tables created with >= InnoDB-4.1.12, and such columns in old tables 
cannot be referenced by such columns in new tables. 
See http://dev.mysql.com/doc/refman/5.6/en/innodb-foreign-key-constraints.html 
for correct foreign key definition. 

Je regardai un peu et je me suis assuré qu'ils étaient tous deux du même type (ils étaient) et étaient les deux clés primaires (ils previo usly n'étaient pas) mais l'erreur persiste.

Quelqu'un a-t-il un aperçu de ce qui cause cette situation?

+2

Vous ne disposez pas d'une clé primaire 'room (room_no)'; à la place, ce que vous avez est une clé primaire composite sur 'room (hotel_no, room_no)'. – univerio

+0

merci univerio, j'ai été capable de le résoudre avec votre perspicacité – gsdfhsdfhsdfhsdf

Répondre

2

Parce que les chambres ont une clé primaire composite: (hotel_no, room_no), vous devez spécifier les deux colonnes dans votre relation de clé étrangère sur la table de réservation:

__table_args__ = (
     ForeignKeyConstraint(
      ['hotel_no', 'room_no'], 
      ['rooms.hotel_no', 'rooms.room_no'] 
     ), 
)