Python 在具有SQLAlchemy Core和flask的项目中,我应该将Table()调用放在何处以及如何使用?
所以我想在应用程序中使用SQLAlchemy核心和烧瓶。我已经阅读了文档和很多教程,了解了如何构造应用程序。所有SQLAlchemy核心教程都将数据库描述直接放入应用程序的app.py文件中。我想把这个数据库描述放在它自己的python模块(这里称为tables/here)中,并在我的视图、表单等中使用它。因此,我想实现如下基本布局:Python 在具有SQLAlchemy Core和flask的项目中,我应该将Table()调用放在何处以及如何使用?,python,sqlalchemy,flask-sqlalchemy,Python,Sqlalchemy,Flask Sqlalchemy,所以我想在应用程序中使用SQLAlchemy核心和烧瓶。我已经阅读了文档和很多教程,了解了如何构造应用程序。所有SQLAlchemy核心教程都将数据库描述直接放入应用程序的app.py文件中。我想把这个数据库描述放在它自己的python模块(这里称为tables/here)中,并在我的视图、表单等中使用它。因此,我想实现如下基本布局: myapp/ run.py tables/ __init__.py tables1.py tabl
myapp/
run.py
tables/
__init__.py
tables1.py
tables2.py
...
views/
views1.py
...
...
我特别挣扎的是以下几点:
myapp/
run.py
tables/
__init__.py
tables1.py
tables2.py
...
views/
views1.py
...
...
metadata=metadata()
放入表格/\uuuu init\uuuuuuuuuuuuuuuuuupy
并将其导入表格/\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
表/tablex.py
文件导入实例table=meta.tables[table\u name]
将表从元数据中拉出。但我不知道如何传递元数据对象,以便它保存所有表table=table(name,tmp\u元数据,…)
A.H.让我们一次只做一步。最小应用:
from sqlalchemy import ...
from flask import ...
from flask.ext.sqlalchemy import ...
app = Flask()
db = SQLAlchemy()
class Foo(db.Model):
...
@app.route(...)
def foo():
Foo.query.filter(...)
return ...
让我们将db内容移到一个单独的模块中:
# db.py
from sqlalchemy import ...
from flask.ext.sqlalchemy import ...
from .app import app
db = SQLAlchemy(app)
class Foo(db.Model):
...
# app.py
from flask import ...
from .db import Foo
app = Flask()
@app.route(...)
def foo():
Foo.query.filter(...)
return ...
但是等等,我们有一个循环依赖,所以我们必须将app
移出:
# app.py
from flask import *
app = Flask()
# db.py
from sqlalchemy import ...
from flask.ext.sqlalchemy import ...
from .app import app
db = SQLAlchemy(app)
class Foo(db.Model):
...
# views.py
from flask import ...
from .db import Foo
from .app import app
@app.route(...)
def foo():
Foo.query.filter(...)
return ...
# app.py same
# views.py same
# db/__init__.py
from .common import db
from .foo import Foo
# db/common.py
from flask.ext.sqlalchemy import ...
from ..app import app
db = SQLAlchemy(app)
# db/foo.py
from sqlalchemy import ...
from .common import db
class Foo(db.Model):
...
接下来,我们可以拆分db.py
:
# app.py same
# views.py same
# db/__init__.py
from flask.ext.sqlalchemy import ...
from ..app import app
from .foo import Foo
db = SQLAlchemy(app)
# db/foo.py
from sqlalchemy import ...
from . import db
class Foo(db.Model):
...
但是等等,我们又有一个循环依赖项,所以我们必须将db
移出:
# app.py
from flask import *
app = Flask()
# db.py
from sqlalchemy import ...
from flask.ext.sqlalchemy import ...
from .app import app
db = SQLAlchemy(app)
class Foo(db.Model):
...
# views.py
from flask import ...
from .db import Foo
from .app import app
@app.route(...)
def foo():
Foo.query.filter(...)
return ...
# app.py same
# views.py same
# db/__init__.py
from .common import db
from .foo import Foo
# db/common.py
from flask.ext.sqlalchemy import ...
from ..app import app
db = SQLAlchemy(app)
# db/foo.py
from sqlalchemy import ...
from .common import db
class Foo(db.Model):
...
SQLAlchemy核心配置完全相同,除了用您的
Foo_table=table(…)
声明替换class Foo之外。SQLAlchemy核心配置完全相同,除了用您的Foo_table=table(…)替换class Foo之外声明。这正是让我困惑的地方。因此,为了使用我的表,我需要导入foo_表实例?有没有办法只导入包含所有表的元数据对象,还是需要导入实例(因为table()调用是在元数据创建之后进行的)?@AHoover元数据对象位于db.metadata
,因此您可以只导入db
。是的,但是在foo\u table=table(…,metadata,…)之前需要调用asmetadata=metadata()
除非在元数据对象之前导入表实例,否则元数据对象不会包含表。因此,我想答案是,如果我想访问表,我应该导入表实例?@AHooverdb=SQLAlchemy(app)
初始化元数据。它保证在您的表声明之前执行,因为我们从foo.py
导入db
,并且我们保证导入您的表声明,因为我们从db/\uuuu init\uuuuuu.py
中的导入将从sqlalchemy导入元数据
和Metadata=Metadata()
放入common.py
,从.common导入元数据
和从.foo导入foo_表
(其中foo_表=表(…)
在foo.py
中),然后我可以简单地从.db导入元数据,然后元数据对象将保存我的所有表定义,如foo_table
?或者我可以使用从.db导入foo_table
导入我的表。如果是这样,我很乐意接受您的回答!