Python 烧瓶应用模型模块
我正在构建一个flask应用程序Python 烧瓶应用模型模块,python,flask,flask-sqlalchemy,Python,Flask,Flask Sqlalchemy,我正在构建一个flask应用程序foo,到目前为止,这就是文件的组织方式 foo |-- app | |-- __init__.py | |-- models.py | |-- foo.py 在\uuuu init\uuuu.py中,我定义了一个函数来创建应用程序,然后从foo.py调用它。这就是\uuuu init\uuuuu.py的样子: from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() def create_ap
foo
,到目前为止,这就是文件的组织方式
foo
|-- app
| |-- __init__.py
| |-- models.py
|
|-- foo.py
在\uuuu init\uuuu.py
中,我定义了一个函数来创建应用程序,然后从foo.py
调用它。这就是\uuuu init\uuuuu.py
的样子:
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
def create_app(config_name):
app = Flask(__name__)
...
db.init_app(app)
模块models.py
导入db
并访问现有数据库。到目前为止,我一直在使用db.engine.execute()
进行查询,但它似乎有点低效。例如,我有一个名为var
的表,我经常在我的应用程序中访问它,因此我在models.py
class Var(object):
def query ...
但是我想用炼金术来代替:
class Var(db.Model):
...
我试图按照答案构建我的应用程序,但这些是我迄今为止发现的问题
create\u app
函数中插入base.metadata.reflect(db.engine)
,我会收到一个错误,说我需要创建上下文,这没有多大意义,因为这是我创建上下文的地方。当然,如果我使用app.app\u context():base.metadata.reflect(db.engine)执行,我可以四处走动,但是当我创建类Var
时,问题仍然存在:
类别变量(db.Model):
表=db.Model.metadata.tables['var']
KeyError
models
来创建我的类Var
时,它也失败了,因为它无法导入它我已经尝试了我找到的所有建议,但似乎都不管用。感谢您的帮助问题在于您使用的是
Flask SQLAlchemy
,与大多数Flask扩展一样,它与Flask绑定,并且为了运行某些任务,它需要一个Flask上下文,但是为了反映已经存在的数据库,您需要一个独立于任何请求的引擎
您可能仍然可以通过在任何需要的地方使用app.app_context()来使用
db
,但最好不要使用Flask-SQLAlchemy
,而是直接使用SQLAlchemy
并使用create\u-engine
,就像您链接的问题一样。问题在于您使用的是Flask SQLAlchemy
,与大多数Flask扩展一样,它与Flask绑定,并且为了运行某些任务,它需要一个Flask上下文,但为了反映已经存在的数据库,您需要一个独立于任何请求的引擎
您可能仍然可以通过在任何需要的地方使用app.app_context()来使用
db
,但最好不要使用Flask-SQLAlchemy
,而是直接使用SQLAlchemy
并使用create\u-engine
,就像你链接的问题一样。你不需要在模型内部设置table
,db.model
已经为你设置了表。@LuisOrduz我明白了,那么我如何将类Var
链接到表Var
?类Var
就是表。要创建它,只需将类导入到运行create_all
方法的位置。这就是我得到的ArgumentError:Mapper Mapper | Var | Var无法为映射表“Var”组装任何主键列,我假设这意味着我需要定义表的结构(列、主键等等),这就是解决方案吗?您没有向表中添加主键<代码>类变量(db.Model):。。。id=db.Column(db.Integer,primary_key=True).
您不需要在模型内部设置table
,db.model
已经为您设置了表。@LuisOrduz我明白了,那么如何将类Var
链接到表Var
?类Var
就是表。要创建它,只需将类导入到运行create_all
方法的位置。这就是我得到的ArgumentError:Mapper Mapper | Var | Var无法为映射表“Var”组装任何主键列,我假设这意味着我需要定义表的结构(列、主键等等),这就是解决方案吗?您没有向表中添加主键<代码>类变量(db.Model):。。。id=db.Column(db.Integer,主键=True).