Python 使用spellfix1表反映sqlite数据库

Python 使用spellfix1表反映sqlite数据库,python,sqlite,sqlalchemy,Python,Sqlite,Sqlalchemy,我试图反映一个基于sqlite的数据库(更具体地说是数据库) 我可以连接到数据库: import sqlalchemy as sa from sqlalchemy.orm import create_session from sqlalchemy.ext.automap import automap_base from sqlalchemy.engine.reflection import Inspector conn = 'sqlite:////..../com.plexapp.plugi

我试图反映一个基于sqlite的数据库(更具体地说是数据库)

我可以连接到数据库:

import sqlalchemy as sa
from sqlalchemy.orm import create_session

from sqlalchemy.ext.automap import automap_base
from sqlalchemy.engine.reflection import Inspector

conn = 'sqlite:////..../com.plexapp.plugins.library.db-2016-07-17'
eng = sa.create_engine(conn)
plex = eng.connect()
我可以查询数据库:

s = create_session(plex)
r = s.execute('SELECT COUNT(*) FROM METADATA_ITEMS')

r.fetchall()

>>> [(55368,)]
我甚至可以用SQLAlchemy的检查员检查所有的表格

i = Inspector.from_engine(plex)
i.get_sorted_table_and_fkc_names()
>>>> [('metadata_item_views', set()),
 ('cloudsync_files', set()),
 ('library_timeline_entries', set()),
 ('synced_ancestor_items', set()),
 ('schema_migrations', set()),
 ('fts4_tag_titles_stat', set()),
 ('spellfix_tag_titles', set()),
 ('metadata_items', set()),
 ('media_streams', set()),
 ('metadata_relations', set()),
 ('play_queue_generators', set()),
 ...
然而,我似乎无法反映整个数据库。我得到了一个丑陋的大例外:

m = sa.MetaData(bind=plex)
m.reflect()
>>>>
   ---------------------------------------------------------------------------
OperationalError                          Traceback (most recent call last)
/opt/anaconda3/lib/python3.5/site-packages/sqlalchemy/engine/base.py in _execute_context(self, dialect, constructor, statement, parameters, *args)
   1138                         parameters,
-> 1139                         context)
   1140         except Exception as e:

/opt/anaconda3/lib/python3.5/site-packages/sqlalchemy/engine/default.py in do_execute(self, cursor, statement, parameters, context)
    449     def do_execute(self, cursor, statement, parameters, context=None):
--> 450         cursor.execute(statement, parameters)
    451 

OperationalError: no such module: spellfix1

The above exception was the direct cause of the following exception:

OperationalError                          Traceback (most recent call last)
<ipython-input-58-8cb90bbdb0ad> in <module>()
      1 m = sa.MetaData(bind=plex)
      2 
----> 3 m.reflect()

/opt/anaconda3/lib/python3.5/site-packages/sqlalchemy/sql/schema.py in reflect(self, bind, schema, views, only, extend_existing, autoload_replace, **dialect_kwargs)
   3653 
   3654             for name in load:
-> 3655                 Table(name, self, **reflect_opts)
   3656 
   3657     def append_ddl_listener(self, event_name, listener):

/opt/anaconda3/lib/python3.5/site-packages/sqlalchemy/sql/schema.py in __new__(cls, *args, **kw)
    414             except:
    415                 with util.safe_reraise():
--> 416                     metadata._remove_table(name, schema)
    417 
    418     @property

/opt/anaconda3/lib/python3.5/site-packages/sqlalchemy/util/langhelpers.py in __exit__(self, type_, value, traceback)
     58             exc_type, exc_value, exc_tb = self._exc_info
     59             self._exc_info = None   # remove potential circular references
---> 60             compat.reraise(exc_type, exc_value, exc_tb)
     61         else:
     62             if not compat.py3k and self._exc_info and self._exc_info[1]:

/opt/anaconda3/lib/python3.5/site-packages/sqlalchemy/util/compat.py in reraise(tp, value, tb, cause)
    184         if value.__traceback__ is not tb:
    185             raise value.with_traceback(tb)
--> 186         raise value
    187 
    188 else:

/opt/anaconda3/lib/python3.5/site-packages/sqlalchemy/sql/schema.py in __new__(cls, *args, **kw)
    409             metadata._add_table(name, schema, table)
    410             try:
--> 411                 table._init(name, metadata, *args, **kw)
    412                 table.dispatch.after_parent_attach(table, metadata)
    413                 return table

/opt/anaconda3/lib/python3.5/site-packages/sqlalchemy/sql/schema.py in _init(self, name, metadata, *args, **kwargs)
    482         # circular foreign keys
    483         if autoload:
--> 484             self._autoload(metadata, autoload_with, include_columns)
    485 
    486         # initialize all the column, etc. objects.  done after reflection to

/opt/anaconda3/lib/python3.5/site-packages/sqlalchemy/sql/schema.py in _autoload(self, metadata, autoload_with, include_columns, exclude_columns)
    494             autoload_with.run_callable(
    495                 autoload_with.dialect.reflecttable,
--> 496                 self, include_columns, exclude_columns
    497             )
    498         else:

/opt/anaconda3/lib/python3.5/site-packages/sqlalchemy/engine/base.py in run_callable(self, callable_, *args, **kwargs)
   1475 
   1476         """
-> 1477         return callable_(self, *args, **kwargs)
   1478 
   1479     def _run_visitor(self, visitorcallable, element, **kwargs):

/opt/anaconda3/lib/python3.5/site-packages/sqlalchemy/engine/default.py in reflecttable(self, connection, table, include_columns, exclude_columns)
    362             self, connection, table, include_columns, exclude_columns):
    363         insp = reflection.Inspector.from_engine(connection)
--> 364         return insp.reflecttable(table, include_columns, exclude_columns)
    365 
    366     def get_pk_constraint(self, conn, table_name, schema=None, **kw):

/opt/anaconda3/lib/python3.5/site-packages/sqlalchemy/engine/reflection.py in reflecttable(self, table, include_columns, exclude_columns)
    561 
    562         for col_d in self.get_columns(
--> 563                 table_name, schema, **table.dialect_kwargs):
    564             found_table = True
    565 

/opt/anaconda3/lib/python3.5/site-packages/sqlalchemy/engine/reflection.py in get_columns(self, table_name, schema, **kw)
    367         col_defs = self.dialect.get_columns(self.bind, table_name, schema,
    368                                             info_cache=self.info_cache,
--> 369                                             **kw)
    370         for col_def in col_defs:
    371             # make this easy and only return instances for coltype

<string> in get_columns(self, connection, table_name, schema, **kw)

/opt/anaconda3/lib/python3.5/site-packages/sqlalchemy/engine/reflection.py in cache(fn, self, con, *args, **kw)
     52     ret = info_cache.get(key)
     53     if ret is None:
---> 54         ret = fn(self, con, *args, **kw)
     55         info_cache[key] = ret
     56     return ret

/opt/anaconda3/lib/python3.5/site-packages/sqlalchemy/dialects/sqlite/base.py in get_columns(self, connection, table_name, schema, **kw)
   1181     def get_columns(self, connection, table_name, schema=None, **kw):
   1182         info = self._get_table_pragma(
-> 1183             connection, "table_info", table_name, schema=schema)
   1184 
   1185         columns = []

/opt/anaconda3/lib/python3.5/site-packages/sqlalchemy/dialects/sqlite/base.py in _get_table_pragma(self, connection, pragma, table_name, schema)
   1478         qtable = quote(table_name)
   1479         statement = "%s%s(%s)" % (statement, pragma, qtable)
-> 1480         cursor = connection.execute(statement)
   1481         if not cursor._soft_closed:
   1482             # work around SQLite issue whereby cursor.description

/opt/anaconda3/lib/python3.5/site-packages/sqlalchemy/engine/base.py in execute(self, object, *multiparams, **params)
    904         """
    905         if isinstance(object, util.string_types[0]):
--> 906             return self._execute_text(object, multiparams, params)
    907         try:
    908             meth = object._execute_on_connection

/opt/anaconda3/lib/python3.5/site-packages/sqlalchemy/engine/base.py in _execute_text(self, statement, multiparams, params)
   1052             statement,
   1053             parameters,
-> 1054             statement, parameters
   1055         )
   1056         if self._has_events or self.engine._has_events:

/opt/anaconda3/lib/python3.5/site-packages/sqlalchemy/engine/base.py in _execute_context(self, dialect, constructor, statement, parameters, *args)
   1144                 parameters,
   1145                 cursor,
-> 1146                 context)
   1147 
   1148         if self._has_events or self.engine._has_events:

/opt/anaconda3/lib/python3.5/site-packages/sqlalchemy/engine/base.py in _handle_dbapi_exception(self, e, statement, parameters, cursor, context)
   1339                 util.raise_from_cause(
   1340                     sqlalchemy_exception,
-> 1341                     exc_info
   1342                 )
   1343             else:

/opt/anaconda3/lib/python3.5/site-packages/sqlalchemy/util/compat.py in raise_from_cause(exception, exc_info)
    200     exc_type, exc_value, exc_tb = exc_info
    201     cause = exc_value if exc_value is not exception else None
--> 202     reraise(type(exception), exception, tb=exc_tb, cause=cause)
    203 
    204 if py3k:

/opt/anaconda3/lib/python3.5/site-packages/sqlalchemy/util/compat.py in reraise(tp, value, tb, cause)
    183             value.__cause__ = cause
    184         if value.__traceback__ is not tb:
--> 185             raise value.with_traceback(tb)
    186         raise value
    187 

/opt/anaconda3/lib/python3.5/site-packages/sqlalchemy/engine/base.py in _execute_context(self, dialect, constructor, statement, parameters, *args)
   1137                         statement,
   1138                         parameters,
-> 1139                         context)
   1140         except Exception as e:
   1141             self._handle_dbapi_exception(

/opt/anaconda3/lib/python3.5/site-packages/sqlalchemy/engine/default.py in do_execute(self, cursor, statement, parameters, context)
    448 
    449     def do_execute(self, cursor, statement, parameters, context=None):
--> 450         cursor.execute(statement, parameters)
    451 
    452     def do_execute_no_params(self, cursor, statement, context=None):

OperationalError: (sqlite3.OperationalError) no such module: spellfix1 [SQL: 'PRAGMA table_info("spellfix_metadata_titles")']
m=sa.MetaData(bind=plex)
m、 反映()
>>>>
---------------------------------------------------------------------------
操作错误回溯(最近一次呼叫最后一次)
/执行上下文中的opt/anaconda3/lib/python3.5/site-packages/sqlalchemy/engine/base.py(self、方言、构造函数、语句、参数、*args)
1138个参数,
->1139(上下文)
1140例外情况除外,如e:
/do_execute中的opt/anaconda3/lib/python3.5/site-packages/sqlalchemy/engine/default.py(self、游标、语句、参数、上下文)
449 def do_execute(self、游标、语句、参数、上下文=无):
-->450游标。执行(语句、参数)
451
操作错误:没有这样的模块:spellfix1
上述异常是以下异常的直接原因:
操作错误回溯(最近一次呼叫最后一次)
在()
1 m=sa.MetaData(bind=plex)
2.
---->3 m.反射()
/反射中的opt/anaconda3/lib/python3.5/site-packages/sqlalchemy/sql/schema.py(self、bind、schema、views、only、extend_existing、autoload_replace、**方言_kwargs)
3653
3654对于加载中的名称:
->3655表(名称、自身、**反映选项)
3656
3657 def append_ddl_侦听器(自身、事件名称、侦听器):
/opt/anaconda3/lib/python3.5/site-packages/sqlalchemy/sql/schema.py in uuuuu new_uuuu(cls,*args,**kw)
414除:
415使用util.safe_reraise():
-->416元数据。删除表(名称、架构)
417
418@property
/opt/anaconda3/lib/python3.5/site-packages/sqlalchemy/util/langhelpers.py in\uuuuuuuu exit\uuuuuuuuu(self,type,value,traceback)
58 exc_类型,exc_值,exc_tb=self.\u exc_信息
59 self._exc_info=None#删除潜在的循环引用
--->60个兼容版本(exc_类型、exc_值、exc_tb)
61.其他:
62如果不是compat.py3k和self.\u exc\u info和self.\u exc\u info[1]:
/在reraise中选择/anaconda3/lib/python3.5/site-packages/sqlalchemy/util/compat.py(tp、value、tb、cause)
184如果值.\uuuu回溯\uuuuu不是tb:
185提升值。带_回溯(tb)
-->186提高价值
187
188.其他:
/opt/anaconda3/lib/python3.5/site-packages/sqlalchemy/sql/schema.py in uuuuu new_uuuu(cls,*args,**kw)
409元数据。添加表(名称、架构、表)
410尝试:
-->411表._init(名称、元数据、*args、**kw)
412表。调度。在\u父\u附加后(表,元数据)
413返回表
/opt/anaconda3/lib/python3.5/site-packages/sqlalchemy/sql/schema.py in_init(self、name、metadata、*args、**kwargs)
482#循环外键
483如果自动加载:
-->484自动加载(元数据、自动加载、包含列)
485
486#初始化所有列等对象。经过深思熟虑后完成
/opt/anaconda3/lib/python3.5/site-packages/sqlalchemy/sql/schema.py in_autoload(self、metadata、autoload_with、include_columns、exclude_columns)
494使用.run\u callable自动加载\u(
495带.dialogue.reflecttable的自动加载_,
-->496 self,include_列,exclude_列
497             )
498其他:
/opt/anaconda3/lib/python3.5/site-packages/sqlalchemy/engine/base.py in run_callable(self,callable_,*args,**kwargs)
1475
1476         """
->1477返回可调用函数(self、*args、**kwargs)
1478
1479定义运行访问者(自我、访问者可调用、元素、**kwargs):
/反射表中的opt/anaconda3/lib/python3.5/site-packages/sqlalchemy/engine/default.py(self、connection、table、include_列、exclude_列)
362 self,connection,table,include_列,exclude_列):
363 insp=来自发动机(连接)的反射检查仪
-->364返回检查反射表(表,包括列,排除列)
365
366 def get_pk_约束(self,conn,table_name,schema=None,**kw):
/反射表中的opt/anaconda3/lib/python3.5/site-packages/sqlalchemy/engine/reflection.py(self、table、include_列、exclude_列)
561
562用于self.get\u列中的列(
-->563表名称、模式,**表.方言(kwargs):
564已找到\u表=真
565
/get_列中的opt/anaconda3/lib/python3.5/site-packages/sqlalchemy/engine/reflection.py(self,table_name,schema,**kw)
367 col_defs=self.dialogue.get_列(self.bind、table_name、schema、,
368 info\u cache=self.info\u cache,
-->369**kw)
370对于Colu def中的Colu def:
371#简化此操作,只返回coltype的实例
在get_列中(self、connection、table_name、schema、**kw)
/缓存中的opt/anaconda3/lib/python3.5/site-packages/sqlalchemy/engine/reflection.py(fn、self、con、*args、**kw)
52 ret=info\u cache.get(键)
53如果ret为无:
--->54 ret=fn(自身、con、*args、**kw)
55信息缓存[键]=返回
56返回ret
/get_列中的opt/anaconda3/lib/python3.5/site-packages/sqlalchemy/dialogons/sqlite/base.py(self、connection、table_name、schema,**kw)
1181 def get_列(self、connection、table_name、schema=None、**kw):
1182 info=self.\u get\u table\u pragma(
->1183连接,“表信息”,表名称,schema=schema)
1184
1185列=[]
/opt/anaco
m = sa.MetaData(plex)
m.reflect(only=(lambda x, y: 'spellfix' not in x))
Base = automap_base(metadata=m)
Base.prepare(plex)