SQLAlchemy映射现有数据库遇Python保留字问题的解决咨询
解决SQLAlchemy反射中Python保留字
class的语法错误问题 嘿,这个坑我之前踩过——class是Python的保留字,你直接用local_server.class这种写法,Python解释器根本认不出这是合法语法,直接给你抛SyntaxError太正常了!下面给你几个靠谱的解决办法,按从快速临时到优雅长期的顺序来:
方法1:用getattr()绕开保留字限制
这是最快的临时解决方案,不用修改映射逻辑,直接在查询里通过字符串获取列属性,完美避开保留字的语法限制:
query = ( session .query( logs, getattr(local_server, 'class'), getattr(remote_server, 'class') ) .outerjoin( local_server, logs.local_server_id == local_server.id ) .outerjoin( remote_server, logs.remote_server_id == remote_server.id # 这里注意你原代码的笔误:remte→remote ) )
方法2:通过表的列集合直接引用
你也可以直接通过映射类的__table__.c字典来访问列,用字符串索引绕开保留字:
query = ( session .query( logs, local_server.__table__.c['class'], remote_server.__table__.c['class'] ) .outerjoin( local_server, logs.local_server_id == local_server.id ) .outerjoin( remote_server, logs.remote_server_id == remote_server.id ) )
方法3:自定义映射类重命名列(更优雅)
如果后续还要频繁用到这个列,建议直接在反射阶段给它重命名,避免每次都要绕弯子。你可以继承automap_base生成的类,给class列起个合法的别名,比如class_:
from sqlalchemy import orm, create_engine from sqlalchemy.ext.automap import automap_base from django.conf import settings base = automap_base() connection_setup = ( "{driver}://{user}:{password}@{host}:{port}/{dbname}".format( **settings.ALCHEMY_DB)) engine = create_engine(connection_setup, echo=False) base.prepare(engine, reflect=True) # 自定义Server类,给class列重命名为class_ class Server(base.classes.server): __tablename__ = 'server' # 用column_property把原class列映射为合法的class_ class_ = orm.column_property(base.classes.server.__table__.c['class']) # 替换原来的server引用 server = Server local_server = orm.aliased(server, name='local_server') remote_server = orm.aliased(server, name='remote_server') scoped_session = orm.scoped_session(orm.sessionmaker(bind=engine)) session = scoped_session() logs = base.classes.logs query = ( session .query( logs, local_server.class_, remote_server.class_ ) .outerjoin( local_server, logs.local_server_id == local_server.id ) .outerjoin( remote_server, logs.remote_server_id == remote_server.id ) ) rows = query.all()
最后提个小细节:你原代码里的logs.remte_server_id少了一个字母o,应该是logs.remote_server_id,这个笔误会导致外连接匹配失败,记得修正!
内容的提问来源于stack exchange,提问作者Drachenfels
相关产品推荐
相关产品推荐

