1

我想从包含 postgresql ARRAY 的 sqlalchemy 类生成逐字 CREATE TABLE .sql 字符串。

在没有 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 而无需创建引擎。不过,我不确定这是否可能,在此先感谢。

4

1 回答 1

1

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

于 2012-11-24T13:43:23.483 回答