Sqlalchemy:导入的未定义变量:metadata

2 投票
3 回答
2269 浏览
提问于 2025-04-17 15:58

我在一个外部模块中声明基础变量时遇到了上面的错误。这个基础变量是在模块 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

撰写回答