2012-04-27 78 views
1

我正在使用SQLAlchemy 0.7.6。我使用的是别名列:sqlalchemy + sqlite剥离带点的列名?

column = table.c["name"].label("foo.bar") 

和SQLite仅使用'bar'作为结果字段别名。有没有解决方法?

示例代码:

create_table("sqlite:////tmp/test.sqlite", schema) 

engine = create_engine(url) 
metadata = MetaData(engine, reflect=True) 
table = Table("test_table", metadata, schema=schema, autoload=True) 

column = table.c["name"].label("foo.bar") 
cursor = sql.expression.select([column]) 
row = cursor.execute().fetchone() 

print "keys are: %s" % (row.keys(),) 

将打印:

keys are: [u'bar'] 

代替:

keys are: [u'foo.bar'] 

Works的postgres的。

下面是完整的测试代码:https://gist.github.com/2506388

我已经报道,在SQLAlchemy的名单,但是同时,我想知道是否有人遇到类似的问题,可能有一个解决方法。

+1

简单的答案是不使用的列名点,但我敢肯定,你已经知道了;) 。 – weenoid 2012-04-27 08:33:46

+0

奇怪>当我运行你的代码时,我有'SA-0.7.4',我确实得到了'键是:[u'foo.bar']'。 – van 2012-04-27 08:41:18

+0

@van:是的,它有可能,因为它工作在0.7(请记住在2011年3月有0.6s的东西这个确切的问题) – Stiivi 2012-04-27 09:20:48

回答

1

将在SQLAlchemy中使用引擎选项进行修补。有关更多信息,请参阅mailing list thread

同时,解决办法是:补丁后

# select is sqlalchemy.sql.expression.select() 
# each selected column was derived as column = table.c[reference].label(label_with_dot) 

labels = [c.name for c in select.columns] 
... 
record = dict(zip(labels, row)) 

解决办法是:

conn = engine.connect().execution_options(sqlite_raw_colnames=True) 
result = conn.execute(stmt)