本站消息

站长简介/公众号


站长简介:逗比程序员,理工宅男,前每日优鲜python全栈开发工程师,利用周末时间开发出本站,欢迎关注我的微信公众号:幽默盒子,一个专注于搞笑,分享快乐的公众号

  价值13000svip视频教程,python大神匠心打造,零基础python开发工程师视频教程全套,基础+进阶+项目实战,包含课件和源码

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

sqlalchemy - 用空格反映表和列

发布于2021-09-11 15:47     阅读(1025)     评论(0)     点赞(22)     收藏(2)



如何在列名(和表名)中有空格的数据库上使用 sqlalchemy?

db.auth_stuff.filter("db.auth_stuff.first name"=='Joe')显然不能工作。而不是在进行反射时手动定义所有内容,我想在lambda x: x.replace(' ','_')从数据库读取的现有表名之间放置类似的东西,并在我的模型中使用。(创建一个通用函数来重命名所有不适用于 python 的表名 - 保留字等也可能有用)

有没有一种简单/干净的方法来做到这一点?

我想我需要定义自己的映射器类?

https://groups.google.com/forum/#!msg/sqlalchemy/pE1ZfBlq56w/ErPcn1YYSJgJ

或者使用某种__mapper_args__参数 - http://docs.sqlalchemy.org/en/rel_0_8/orm/mapper_config.html#naming-all-columns-with-a-prefix

理想情况下:

class NewBase(Base):
    __mapper_args__ = {
        'column_rename_function' : lambda x: x.replace(' ','_')
    }

class User(NewBase):
    __table__ = "user table"
    }

解决方案


您可以使用反射事件为列提供 .key来执行此操作,但是当涉及主键列时,完整配方有一个错误,该错误已在仍未发布的 0.8.3 版本(以及主版本)中修复。如果您在https://bitbucket.org/zzzeek/sqlalchemy/get/rel_0_8.zip 上查看 0.8.3,则即使使用主键列,此方法也适用:

from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import declarative_base, DeferredReflection

Base = declarative_base(cls=DeferredReflection)


e = create_engine("sqlite://", echo=True)
e.execute("""
    create table "user table" (
            "id col" integer primary key,
            "data col" varchar(30)
    )
""")

from sqlalchemy import event

@event.listens_for(Table, "column_reflect")
def reflect_col(inspector, table, column_info):
    column_info['key'] = column_info['name'].replace(' ', '_')

class User(Base):
    __tablename__ = "user table"

Base.prepare(e)

s = Session(e)
print s.query(User).filter(User.data_col == "some data")

DeferredReflection是一个可选的辅助函数,用于声明式 + 反射。






所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:https://www.pythonheidong.com/blog/article/1037336/8c5a4fb90dbfba90dbeb/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

22 0
收藏该文
已收藏

评论内容:(最多支持255个字符)