繁体   English   中英

sqlalchemy-用空格反映表和列

[英]sqlalchemy - reflecting tables and columns with spaces

如何在列名(和表名)中包含空格的数据库上使用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是用于声明式+反射的可选辅助程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM