J'essaie d'adapter une partie d'une application MySQLdb à sqlalchemy dans une base déclarative. Je ne fais que commencer avec sqlalchemy.sqlalchemy: union requête quelques colonnes de plusieurs tables avec condition
Les tableaux anciens sont définis quelque chose comme:
student: id_number*, semester*, stateid, condition, ...
choice: id_number*, semester*, choice_id, school, program, ...
Nous avons 3 tables pour chacun d'eux (student_tmp
, student_year
, student_summer
, choice_tmp
, choice_year
, choice_summer
), de sorte que chaque paire (_tmp
, _year
, _summer
) contient des informations pour un moment spécifique.
select *
from `student_tmp`
inner join `choice_tmp` using (`id_number`, `semester`)
Mon problème est l'information qui est important pour moi est d'obtenir l'équivalent de ce qui suit select:
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
*
utilisé pour réduire la sélection, mais je suis en fait interroger seulement environ 7 colonnes sur les 50 disponibles.
Cette information est utilisée dans beaucoup de saveurs ... "Est-ce que j'ai des nouveaux étudiants, est-ce que j'ai toujours tous les élèves d'une date donnée, quels étudiants sont inscrits après la date donnée? L'instruction select doit être enregistrée dans une autre base de données.
Serait-il possible pour moi d'y parvenir avec une classe de vue unique? L'information est en lecture seule, je n'ai donc pas besoin de pouvoir modifier/créer/supprimer. Ou dois-je déclarer une classe pour chaque table (se terminant avec 6 classes) et chaque fois que j'ai besoin d'interroger, je dois me rappeler de filtrer?
Merci pour les pointeurs.
EDIT: Je n'ai pas d'accès de modification à la base de données (je ne peux pas créer une vue). Les deux bases de données peuvent ne pas être sur le même serveur (donc je ne peux pas créer une vue sur ma deuxième DB).
Mon souci est d'éviter l'analyse complète de la table avant de filtrer sur condition
et choice_id
.
EDIT 2: Je l'ai mis en place des classes déclaratives comme ceci:
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): ...
Maintenant, la requête qui me donne SQL correct pour un jeu de table est:
q = session.query(StudentYear, ChoiceYear) \
.select_from(StudentYear) \
.join(ChoiceYear) \
.filter(StudentYear.condition=='A') \
.filter(ChoiceYear.choice_id=='4')
mais il émet une exception ...
"Could not locate column in row for column '%s'" % key)
sqlalchemy.exc.NoSuchColumnError: "Could not locate column in row for column '*'"
Comment utiliser cette requête me créer une classe que je peux utiliser?
Quel est le modèle 'Social' référencé dans FK de' Choice'? – van
Désolé, c'est censé être étudiant, mis à jour. – Danosaure