2017-02-16 12 views
0

私はSQLAlchemyのnoobで、部屋の空き容量の少ないWebアプリケーションを作成して学びます。私は参照テーブルの束(曜日、部屋番号、コース番号など)と参照テーブルへの外部キーを持つルームスケジュールテーブルを持っているので、私のテーブルを正規化しました。問題は、私はroom_scheduleテーブルへの挿入を行うときに、それがバックしようとしている外部キーのテーブルへの挿入

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


Base = declarative_base() 
metadata = Base.metadata 


class Course(Base): 
    __tablename__ = 'courses' 

    course_id = Column(Integer, primary_key=True, unique=True) 
    course_number = Column(String(8), nullable=False, unique=True) 


class DayOfWeek(Base): 
    __tablename__ = 'day_of_week' 

    day_id = Column(Integer, primary_key=True) 
    weekday = Column(String(10), nullable=False) 


class EndTime(Base): 
    __tablename__ = 'end_time' 

    end_id = Column(Integer, primary_key=True, unique=True) 
    end_time = Column(String(8), nullable=False) 


class Quarter(Base): 
    __tablename__ = 'quarter' 

    quarter_id = Column(Integer, primary_key=True, unique=True) 
    quarter_name = Column(String(10), nullable=False, unique=True) 


class Room(Base): 
    __tablename__ = 'room' 

    room_id = Column(Integer, primary_key=True, unique=True) 
    room_number = Column(Integer, nullable=False, unique=True) 


class RoomSchedule(Base): 
    __tablename__ = 'room_schedule' 

    schedule_id = Column(Integer, primary_key=True) 
    fk_room_id = Column(ForeignKey('room.room_id'), nullable=False, index=True) 
    fk_quarter_id = Column(ForeignKey('quarter.quarter_id'), nullable=False, index=True) 
    fk_day_id = Column(ForeignKey('day_of_week.day_id'), nullable=False, index=True) 
    fk_start_time = Column(ForeignKey('start_time.time_id'), nullable=False, index=True) 
    fk_end_time = Column(ForeignKey('end_time.end_id'), index=True) 
    fk_course_id = Column(ForeignKey('courses.course_id'), nullable=False, index=True) 

    fk_course = relationship('Course') 
    fk_day = relationship('DayOfWeek') 
    end_time = relationship('EndTime') 
    fk_quarter = relationship('Quarter') 
    fk_room = relationship('Room') 
    start_time = relationship('StartTime') 


class StartTime(Base): 
    __tablename__ = 'start_time' 

    time_id = Column(Integer, primary_key=True, unique=True) 
    start = Column(String(6), nullable=False) 

:私はもともとのAutomap機能を使用してそれはそうと同じように、私はモデルを作成するためにsqlacodegenを使用し動作していないようでした試してみました - 参照テーブルに挿入します。挿入する私の現在の試みは、次のようになります。

sched = RoomSchedule() 
sched.fk_course = session.query(Course.course_id).filter(Course.course_number =='CS250') 
sched.fk_day = session.query(DayOfWeek.day_id).filter(DayOfWeek.weekday =='Tuesday') 
sched.fk_end_time = session.query(EndTime.end_id).filter(EndTime.end_time == '22:00') 
sched.fk_quarter = session.query(Quarter.quarter_id).filter(Quarter.quarter_name=='1701') 
sched.fk_room = session.query(Room.room_id).filter(Room.room_number=='416') 
sched.fk_start_time = session.query(StartTime.time_id).filter(StartTime.start=='7:30') 
session.add(sched) 
session.commit() 

私も同様に、外部キーを与えるために、個々のクラスのコンストラクタを使用してみました。私はまっすぐにPythonでこの問題を解決しようとしていた場合は

、私はこれを行うだろう:

def insert_room_busy(con, room_num, quarter_name, day_name, start_time, end_time, course_number): 
    insert_data = 'insert into room_schedule (fk_room_id, fk_quarter_id, fk_day_id, fk_start_time, fk_end_time, fk_course_id) ' \ 
        'values((select room_id from room where room_number= %s), ' \ 
        '(select quarter_id from quarter where quarter_name= %s), ' \ 
        '(select day_id from day_of_week where weekday= %s), ' \ 
        '(select time_id from start_time where start= %s), ' \ 
        '(select end_id from end_time where end_time= %s), ' \ 
        '(select course_id from courses where course_number= %s));' 
    cursor = con.cursor() 
    cursor.execute(insert_data, (room_num, quarter_name, day_name, start_time, end_time, course_number)) 

、まっすぐSQL外部キーを見つけるために、サブクエリを使用して、同じように見えるだろう。

これを「正しい」方法で行うにはどうすればよいですか?

+0

このコードは 'fk_course'(または他のそのような属性)が関係であり、' Course'インスタンスを受け入れるので、私のために例外をスローします。あなたの例では 'Query'オブジェクトを割り当てようとします。あなたの表現をチェックできますか? 'sched.fk_course = session.query(Course).filter(Course.course_number == 'CS250')。first()'のようになります。 –

+0

Course(等)インスタンスを作成しようとしましたが、それでもCourseテーブルに挿入しようとしました。私はそれを望んでいません - 私はRoomScheduleテーブルにcourse_idを挿入したいと思います。 – zenlc2000

答えて

0

私はまだ答えがわかりませんが、私はMongoDBに切り替えました。人生はずっと簡単です。

関連する問題