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 に答える