MySQLdb アプリケーションの一部を宣言ベースの sqlalchemy に適合させようとしています。私はsqlalchemyから始めたばかりです。
従来のテーブルは次のように定義されています。
student: id_number*, semester*, stateid, condition, ...
choice: id_number*, semester*, choice_id, school, program, ...
それぞれに 3 つのテーブル ( student_tmp
、student_year
、student_summer
、choice_tmp
、 ) があるため、各ペア ( 、choice_year
、) には特定の瞬間の情報が含まれます。choice_summer
_tmp
_year
_summer
select *
from `student_tmp`
inner join `choice_tmp` using (`id_number`, `semester`)
私の問題は、私にとって重要な情報は、次の選択と同等のものを取得することです。
SELECT t.*
FROM (
(
SELECT st.*, ct.*
FROM `student_tmp` AS st
INNER JOIN `choice_tmp` as ct USING (`id_number`, `semester`)
WHERE (ct.`choice_id` = IF(right(ct.`semester`, 1)='1', '3', '4'))
AND (st.`condition` = 'A')
) UNION (
SELECT sy.*, cy.*
FROM `student_year` AS sy
INNER JOIN `choice_year` as cy USING (`id_number`, `semester`)
WHERE (cy.`choice_id` = 4)
AND (sy.`condition` = 'A')
) UNION (
SELECT ss.*, cs.*
FROM `student_summer` AS ss
INNER JOIN `choice_summer` as cs USING (`id_number`, `semester`)
WHERE (cs.`choice_id` = 3)
AND (ss.`condition` = 'A')
)
) as t
*
選択を短縮するために使用されますが、実際には、使用可能な50列のうち約7列のみを照会しています.
この情報はさまざまな形で使用されます...「新しい生徒はいますか?指定された日付のすべての生徒がまだ残っていますか?指定された日付以降に登録されている生徒はどれですか?など...」この select ステートメントの結果は、別のデータベースに保存されます。
単一のビューのようなクラスでこれを達成することは可能でしょうか? 情報は読み取り専用なので、変更/作成/削除できる必要はありません。それとも、テーブルごとにクラスを宣言する必要があり (最終的には 6 つのクラスになります)、クエリが必要になるたびに、フィルター処理を忘れないようにする必要がありますか?
ポインタをありがとう。
編集: データベースへの変更アクセス権がありません (ビューを作成できません)。両方のデータベースが同じサーバー上にない可能性があります (そのため、2 番目の DB にビューを作成できません)。
condition
私の懸念は、およびでフィルタリングする前に、完全なテーブル スキャンを避けることchoice_id
です。
EDIT 2 :次のような宣言型クラスを設定しました:
class BaseStudent(object):
id_number = sqlalchemy.Column(sqlalchemy.String(7), primary_key=True)
semester = sqlalchemy.Column(sqlalchemy.String(5), primary_key=True)
unique_id_number = sqlalchemy.Column(sqlalchemy.String(7))
stateid = sqlalchemy.Column(sqlalchemy.String(12))
condition = sqlalchemy.Column(sqlalchemy.String(3))
class Student(BaseStudent, Base):
__tablename__ = 'student'
choices = orm.relationship('Choice', backref='student')
#class StudentYear(BaseStudent, Base):...
#class StudentSummer(BaseStudent, Base):...
class BaseChoice(object):
id_number = sqlalchemy.Column(sqlalchemy.String(7), primary_key=True)
semester = sqlalchemy.Column(sqlalchemy.String(5), primary_key=True)
choice_id = sqlalchemy.Column(sqlalchemy.String(1))
school = sqlalchemy.Column(sqlalchemy.String(2))
program = sqlalchemy.Column(sqlalchemy.String(5))
class Choice(BaseChoice, Base):
__tablename__ = 'choice'
__table_args__ = (
sqlalchemy.ForeignKeyConstraint(['id_number', 'semester',],
[Student.id_number, Student.semester,]),
)
#class ChoiceYear(BaseChoice, Base): ...
#class ChoiceSummer(BaseChoice, Base): ...
さて、1 セットのテーブルに対して正しい SQL を返すクエリは次のとおりです。
q = session.query(StudentYear, ChoiceYear) \
.select_from(StudentYear) \
.join(ChoiceYear) \
.filter(StudentYear.condition=='A') \
.filter(ChoiceYear.choice_id=='4')
しかし、それは例外をスローします...
"Could not locate column in row for column '%s'" % key)
sqlalchemy.exc.NoSuchColumnError: "Could not locate column in row for column '*'"
そのクエリを使用して、使用できるクラスを自分で作成するにはどうすればよいですか?