2012-11-21 34 views
1

我想从包含postgresql ARRAY的sqlalchemy类生成逐字CREATE TABLE .sql字符串。使用schema.CreateTable生成SQL字符串失败,并使用postgresql ARRAY

以下罚款作品,未经阵列列:

from sqlalchemy.dialects.postgresql import ARRAY 
from sqlalchemy import * 
from geoalchemy import * 
from sqlalchemy.ext.declarative import declarative_base 

metadata=MetaData(schema='refineries') 

Base=declarative_base(metadata) 

class woodUsers (Base): 
    __tablename__='gquery_wood' 
    id=Column('id', Integer, primary_key=True) 
    name=Column('name', String) 
    addr=Column('address', String) 
    jsn=Column('json', String) 
    geom=GeometryColumn('geom', Point(2)) 

这个炒菜就像我想它想:

In [1]: from sqlalchemy.schema import CreateTable 
In [3]: tab=woodUsers() 

In [4]: str(CreateTable(tab.metadata.tables['gquery_wood'])) 
Out[4]: '\nCREATE TABLE gquery_wood (\n\tid INTEGER NOT NULL, \n\tname VARCHAR,  \n\taddress VARCHAR, \n\tjson VARCHAR, \n\tgeom POINT, \n\tPRIMARY KEY (id)\n)\n\n' 
然而

当我添加一个PostgreSQL ARRAY列失败:

class woodUsers (Base): 
    __tablename__='gquery_wood' 
    id=Column('id', Integer, primary_key=True) 
    name=Column('name', String) 
    addr=Column('address', String) 
    types=Column('type', ARRAY(String)) 
    jsn=Column('json', String) 
    geom=GeometryColumn('geom', Point(2)) 

与上面相同的命令导致一个长回溯字符串结束于:

/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/visitors.pyc in _compiler_dispatch(self, visitor, **kw) 
    70    getter = operator.attrgetter("visit_%s" % visit_name) 
    71    def _compiler_dispatch(self, visitor, **kw): 
---> 72     return getter(visitor)(self, **kw) 
    73   else: 
    74    # The optimization opportunity is lost for this case because the 

AttributeError: 'GenericTypeCompiler' object has no attribute 'visit_ARRAY' 

如果完整的回溯是有用的,让我知道,我会后。

我认为这与指定编译器(?)的方言有关,但我不确定。我真的很希望能够生成SQL,而无需创建引擎。我不确定这是否可能,但感谢。

回答

1

可能有一个复杂的解决方案,涉及挖掘sqlalchemy.dialects。 你应该首先尝试一下引擎。填写一个虚假的连接url,只是不要调用connect()。

+0

尝试以这种方式添加引擎:'engine = create_engine('postgresql:// scott:tiger @ localhost:5432/mydatabase'); metadata =元数据(引擎,模式='精炼厂')'结果是与上面相同的错误。也许我没有正确添加引擎?如果是的话,道歉。 – PeterT

+0

我会用bind =引擎来明确,但是你做得正确。 – Tobu

+0

仍然没有运气。与上述相同。任何人都可以提出替代方案 – PeterT