2013-10-07 58 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是一個可選的幫手與聲明+反射使用。