我正在尝试使 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 个类)并且每次我需要查询时,我必须记住过滤?
感谢指点。
编辑:我没有对数据库的修改访问权限(我无法创建视图)。两个数据库可能不在同一台服务器上(因此我无法在第二个数据库上创建视图)。
condition
我担心的是在过滤和之前避免全表扫描choice_id
。
编辑 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): ...
现在,为一组表提供正确 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 '*'"
如何使用该查询为自己创建一个可以使用的类?