【问题标题】:sqlalchemy - reflecting tables and columns with spacessqlalchemy - 用空格反映表和列
【发布时间】:2013-10-09 09:22:18
【问题描述】:

如何在列名(和表名)中包含空格的数据库上使用 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"
    }

【问题讨论】:

  • 我认为当您使用声明性设置时这应该不是问题,因为您可以分别指定属性('auth_stuff')和列名('auth stuff')。与表相同。这让我想知道:您是否正在尝试在使用introspection 的同时执行此操作?如果没有,请尝试实际定义您的一张表(例如,用户)。我看不出你正在尝试做的事情不应该奏效的理由。

标签: python sqlalchemy overriding flask-sqlalchemy


【解决方案1】:

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

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 是与声明式 + 反射一起使用的可选助手。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-21
    • 2010-10-07
    • 2014-10-16
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    • 2015-07-27
    • 1970-01-01
    相关资源
    最近更新 更多