Arrays 使用schema.CreateTable生成SQL字符串失败,使用postgresql数组
我想从包含postgresql数组的sqlalchemy类生成verbatim CREATE TABLE.sql字符串 在不使用数组列的情况下,以下操作可以正常工作:Arrays 使用schema.CreateTable生成SQL字符串失败,使用postgresql数组,arrays,postgresql,sqlalchemy,postgis,Arrays,Postgresql,Sqlalchemy,Postgis,我想从包含postgresql数组的sqlalchemy类生成verbatim CREATE TABLE.sql字符串 在不使用数组列的情况下,以下操作可以正常工作: from sqlalchemy.dialects.postgresql import ARRAY from sqlalchemy import * from geoalchemy import * from sqlalchemy.ext.declarative import declarative_base metadata=M
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数组列时失败:
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。不过,我不确定这是否可行,感谢avance。可能有一个复杂的解决方案,涉及到挖掘sqlalchemy.方言。
不过你应该先用引擎试试。填写一个伪造的连接url,不要调用connect()。可能有一个复杂的解决方案,需要挖掘sqlalchemy.dialogs。
不过你应该先用引擎试试。填写一个虚假的连接url,不要调用connect()。尝试以这种方式添加引擎:
engine=create\u engine('postgresql://scott:tiger@localhost:5432/mydatabase');metadata=metadata(engine,schema='refineries')
结果与上述错误相同。也许我没有正确添加引擎?如果是这样的话,我很抱歉。我会使用bind=engine来明确表示,但你做得对。还是没有运气。回复同上。有人能推荐一个替代方案吗?尝试以这种方式添加引擎:engine=create\u engine('postgresql://scott:tiger@localhost:5432/mydatabase');metadata=metadata(engine,schema='refineries')
结果与上述错误相同。也许我没有正确添加引擎?如果是这样的话,我很抱歉。我会使用bind=engine来明确表示,但你做得对。还是没有运气。回复同上。有人能提出一个替代方案吗?