Sqlalchemy:导入的未定义变量:metadata
我在一个外部模块中声明基础变量时遇到了上面的错误。这个基础变量是在模块 db_connect.py 中声明的,具体做法是按照这篇文章的说明:如何在两个不同的文件中创建外键关系
在 db_connect.py 中,我声明了以下内容:
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
Engine = create_engine('postgresql://postgres:pass@server:5432/mydb')
Base = declarative_base()
在 data_template.py 中,我有以下内容:
from db_connect import Engine, Base
class DataTemplate (Base):
__tablename__ = 'data_template'
id = Column(Integer(5), primary_key=True, autoincrement = True)
version = Column(String(3), nullable = False)
specification = Column(String(1), nullable = False)
__table_args__ = (UniqueConstraint("version", "specification"), )
Base.metadata.create_all()
问题一:
根据上面的内容,表格是成功创建的,这很好,但我在 data_template.py: Base.metadata.create_all() 中看到的元数据部分出现了错误提示:从导入中未定义的变量:metadata,这个错误是怎么回事呢?
问题二:
在 load_file.py 中,我需要从 data_template.py 模块导入 DataTemplateFile 类。如果我不这样做,就会出现错误。
sqlalchemy.exc.NoReferencedTableError: Foreign key associated with column 'load_file.data_template_file_id' could not find table 'data_template_file' with which to generate a foreign key to target column 'id'
不过,当我按下面的方式导入时,它可以正常工作并且表格被创建,但在 Eclipse 中会出现一个“警告”,提示 DataTemplateFile 的导入没有被使用。然而,如果我不导入它,代码就会失败,正如上面所解释的那样。
from data_template import DataTemplateFile
class LoadFile (Base):
__tablename__ = "load_file"
id = Column(Integer(10), primary_key = True)
file_name = Column(String(250), nullable = False, unique = True)
data_template_file_id = Column(Integer, ForeignKey('data_template_file.id'), nullable = False)
loadfile = relationship("DataTemplateFile",backref=backref('LoadFile', order_by=id))
3 个回答
0
是的,我在Eclipse中遇到过类似的问题。在一个单元里,我做了:
from sqlalchemy.engine import create_engine
...
engine = create_engine(ENGINE_PATH_AUTH)
然后我把变量“engine”传递给了另一个模块中的一个方法
import sqlalchemy
...
class MyClass():
...
def execute_query(self, sqlstr: str, engine) -> int:
if not isinstance(engine, sqlalchemy.engine.base.Engine): # causes undefined variable!
raise ValueError("SqlAlchemy base engine expected, but %s found!" % type(engine))
...
不过,当我把代码写成下面这样时,错误就不再出现了:
from sqlalchemy import engine as sqlalcheng
...
class MyClass():
...
def execute_query(self, sqlstr: str, engine) -> int:
if not isinstance(engine, sqlalcheng.base.Engine):
raise ValueError("SqlAlchemy base engine expected, but %s found!" % type(engine))
...
0
你需要把 flask.ext 加到强制内置模块里。
0
其实我也遇到过同样的问题。后来我通过进入一个叫做site-packages的文件夹,把sqlalchemy文件夹提升了一个层级来解决的。
所以路径是:
C:\Python\Python27\Lib\site-packages\sqlalchemy
这样就解决了我的问题。
Joe