2013-10-07 49 views
2

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

db.auth_stuff.filter("db.auth_stuff.first name"=='Joe')显然不能工作。我不想在做反射时手动定义所有内容,而是希望在从db中读取现有表名和在我的模型中使用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" 
    } 
+0

当您使用声明设置时,我不认为这应该是一个问题,因为您可以分别指定属性('auth_stuff')和列名称('auth stuff')。与表格相同。这让我想知道:你是在尝试使用[内省](http://docs.sqlalchemy.org/en/rel_0_8/core/reflection.html)的同时做到这一点?如果没有,尝试实际定义一个表(例如用户)。我看不出有什么理由,你想做什么不应该工作。 –

回答

5

您可以使用reflection event给列一个.KEY做到这一点,但是全当涉及主键列时,recipe有一个bug,在尚未发布的0.8.3版本(以及master)中修复了这个bug。如果您在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是一个可选的帮手与声明+反射使用。