回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我一直在试图得到一个相当大的项目,在后端使用SQLAlchemy。我有跨多个文件的表模型,在它自己的文件中有一个声明性的基,还有一个用于包装通用SQLAlchemy函数的helper文件,以及驱动程序文件。在</p>
<p>我正在上传数据,然后决定添加一个列。因为这只是测试数据,所以我认为最简单的方法就是删除所有的表并重新开始。。。然后,当我试图重新创建模式和表时,公共声明性基类突然有了空的元数据。我通过导入类声明文件来解决这个问题——很奇怪,因为我以前不需要这些导入文件——而且它能够成功地重新创建模式。在</p>
<p>但是现在当我再次尝试创建对象时,我得到一个错误:</p>
<pre><code>AttributeError: mapper
</code></pre>
<p>现在我完全糊涂了!有人能解释一下这里发生了什么吗?在我放弃这个模式之前,它运行得很好,现在我不能让它工作了。在</p>
<p>以下是我设置的框架:</p>
<p><strong>基准.py</strong></p>
^{pr2}$
<p><strong>models1.py</strong></p>
<pre><code>from base import Base
class Business(Base):
__tablename__ = 'business'
id = Column(Integer, primary_key=True)
</code></pre>
<p><strong>模型2.py:</strong></p>
<pre><code>from base import Base
class Category(Base):
__tablename__ = 'category'
id = Column(Integer, primary_key=True)
</code></pre>
<p><strong>助手.py:</strong></p>
<pre><code>from base import Base
# I didn't need these two imports the first time I made the schema
# I added them after I was just getting an empty schema from base.Base
# but have no idea why they're needed now?
import models1
import models2
def setupDB():
engine = getDBEngine(echo=True) # also a wrapped func (omitted for space)
#instantiate the schema
try:
Base.metadata.create_all(engine, checkfirst=True)
logger.info("Successfully instantiated Database with model schema")
except:
logger.error("Failed to instantieate Database with model schema")
traceback.print_exc()
def dropAllTables():
engine = getDBEngine(echo=True)
# drop the schema
try:
Base.metadata.reflect(engine, extend_existing=True)
Base.metadata.drop_all(engine)
logger.info("Successfully dropped all the database tables in the schema")
except:
logger.error("Failed to drop all tables")
traceback.print_exc()
</code></pre>
<p><strong>驱动程序.py:</strong></p>
<pre><code>import models1
import models2
# ^ some code to get to this point
categories []
categories.<a href="https://www.cnpython.com/list/append" class="inner-link">append</a>(
models2.Category(alias=category['alias'],
title=category['title']) # error occurs here
)
</code></pre>
<p><strong>堆栈跟踪:(为了完整性)</strong></p>
<pre><code>File "./main.py", line 16, in <module>
yelp.updateDBFromYelpFeed(fname)
File "/Users/thomaseffland/Development/projects/health/pyhealth/pyhealth/data/sources/yelp.py", line 188, in updateDBFromYelpFeed
title=category['title'])
File "<string>", line 2, in __init__
File "/Users/thomaseffland/.virtualenvs/health/lib/python2.7/site-packages/sqlalchemy/orm/instrumentation.py", line 347, in _new_state_if_none
state = self._state_constructor(instance, self)
File "/Users/thomaseffland/.virtualenvs/health/lib/python2.7/site-packages/sqlalchemy/util/langhelpers.py", line 747, in __get__
obj.__dict__[self.__name__] = result = self.fget(obj)
File "/Users/thomaseffland/.virtualenvs/health/lib/python2.7/site-packages/sqlalchemy/orm/instrumentation.py", line 177, in _state_constructor
self.dispatch.first_init(self, self.class_)
File "/Users/thomaseffland/.virtualenvs/health/lib/python2.7/site-packages/sqlalchemy/event/attr.py", line 256, in __call__
fn(*args, **kw)
File "/Users/thomaseffland/.virtualenvs/health/lib/python2.7/site-packages/sqlalchemy/orm/mapper.py", line 2825, in _event_on_first_init
configure_mappers()
File "/Users/thomaseffland/.virtualenvs/health/lib/python2.7/site-packages/sqlalchemy/orm/mapper.py", line 2721, in configure_mappers
mapper._post_configure_properties()
File "/Users/thomaseffland/.virtualenvs/health/lib/python2.7/site-packages/sqlalchemy/orm/mapper.py", line 1710, in _post_configure_properties
prop.init()
File "/Users/thomaseffland/.virtualenvs/health/lib/python2.7/site-packages/sqlalchemy/orm/interfaces.py", line 183, in init
self.do_init()
File "/Users/thomaseffland/.virtualenvs/health/lib/python2.7/site-packages/sqlalchemy/orm/relationships.py", line 1616, in do_init
self._process_dependent_arguments()
File "/Users/thomaseffland/.virtualenvs/health/lib/python2.7/site-packages/sqlalchemy/orm/relationships.py", line 1673, in _process_dependent_arguments
self.target = self.mapper.mapped_table
File "/Users/thomaseffland/.virtualenvs/health/lib/python2.7/site-packages/sqlalchemy/util/langhelpers.py", line 833, in __getattr__
return self._fallback_getattr(key)
File "/Users/thomaseffland/.virtualenvs/health/lib/python2.7/site-packages/sqlalchemy/util/langhelpers.py", line 811, in _fallback_getattr
raise AttributeError(key)
AttributeError: mapper
</code></pre>
<p>我知道这篇文章很长,但我想给出完整的图片。首先,我很困惑为什么<code>base.Base</code>模式是空的。现在我很困惑为什么Categories对象缺少一个映射器!在</p>
<p>如有任何帮助/见解/建议,我们将不胜感激,谢谢!在</p>
<p><strong>编辑:</strong></p>
<p>所以模型文件和<code>helper.py</code>在一个supackage中,<code>driver.py</code>实际上是同级子包中的一个文件,它的代码被包装在函数中。此驱动程序函数由包级主文件调用。所以我不认为这是因为SQLAlchemy还没有时间初始化?(如果我正确理解答案)以下是主文件的(相关部分):</p>
<p><strong>主.py:</strong></p>
<pre><code>import models.helper as helper
helper.setupDB(echo=true) # SQLAlchemy echos the correct statements
import driverpackage.driver as driver
driver.updateDBFromFile(fname) # error occurs in here
</code></pre>
<p>而且<strong>驱动程序.py</strong>实际上看起来像:</p>
<pre><code>import ..models.models1
import ..models.models2
def updateDBFromFile(fname):
# ^ some code to get to this point
categories []
categories.append(
models2.Category(alias=category['alias'],
title=category['title']) # error occurs here
)
# a bunch more code
</code></pre>
<p><strong>编辑2:</strong>
我开始怀疑潜在的问题与我突然需要导入所有模型来在<code>helper.py</code>中建立模式的原因是一样的。如果打印导入模型对象的表,则它们没有绑定的元数据或架构:</p>
<pre><code>print YelpCategory.__dict__['__table__'].__dict__
####
{'schema': None, '_columns': <sqlalchemy.sql.base.ColumnCollection object at 0x102312ef0>,
'name': 'yelp_category', 'description': 'yelp_category',
'dispatch': <sqlalchemy.event.base.DDLEventsDispatch object at 0x10230caf0>,
'indexes': set([]), 'foreign_keys': set([]),
'columns': <sqlalchemy.sql.base.ImmutableColumnCollection object at 0x10230fc58>,
'_prefixes': [],
'_extra_dependencies': set([]),
'fullname': 'yelp_category', 'metadata': MetaData(bind=None),
'implicit_returning': True,
'constraints': set([PrimaryKeyConstraint(Column('id', Integer(), table=<yelp_category>, primary_key=True, nullable=False))]), 'primary_key': PrimaryKeyConstraint(Column('id', Integer(), table=<yelp_category>, primary_key=True, nullable=False))}
</code></pre>
<p>我想知道为什么创建数据库的库中的元数据没有绑定?在</p>