我解决了这个问题。以下是我所做的事情。
Go to ./site-packages/sqlalchemy/dialects
Copy any concrete dialects to the new one (eg: named zeta) as the start point. A better way is to use
from sqlalchemy.engine.default import DefaultDialect
class ZetaDialect(DefaultDialect):
...
Add zeta into __all__
section of ./site-packages/sqlalchemy/dialects/__init__.py
Create a test program:
from sqlalchemy import create_engine
engine = create_engine('zeta://XXX')
result = engine.execute("select * from table_name")
for row in result:
print(row)
运行程序时出现错误,使用pdb找到原因。在大多数情况下,原因是未实现某些接口。逐一解决。
当测试程序给出正确答案时,基本完成了90%。为了完整性,我们还应该实现几个检查器使用的接口:
class ZetaDialect(DefaultDialect):
name = 'zeta'
def __init__(self, **kwargs):
DefaultDialect.__init__(self, **kwargs)
@classmethod
def dbapi(cls):
return zeta_dbapi
@reflection.cache
def get_table_names(self, connection, schema=None, **kw):
return [u'table_1', u'table_2', ...]
@reflection.cache
def get_pk_constraint(self, connection, table_name, schema=None, **kw):
return []
@reflection.cache
def get_foreign_keys(self, connection, table_name, schema=None, **kw):
return []
@reflection.cache
def get_unique_constraints(self, connection, table_name,
schema=None, **kw):
return []
@reflection.cache
def get_indexes(self, connection, table_name, schema=None, **kw):
return []
@reflection.cache
def get_schema_names(self, connection, **kw):
return []
@reflection.cache
def get_columns(self, connection, table_name, schema=None, **kw):
result = connection.execute('select * from %s limit 1' % table_name)
return [{'default': None, 'autoincrement': False, 'type': TEXT, 'name': colname, 'nullable': False} for colname, coltype in result.cursor.description]
from sqlalchemy.dialects import registry registry.register("zeta", "myapp.dialect", "ZetaDialect")
。 - Daniel Böckenhoff