【问题标题】:How is using SQLAlchemy different in Flask framework在 Flask 框架中使用 SQLAlchemy 有何不同
【发布时间】:2016-12-16 17:57:06
【问题描述】:

我已经在 SQLAlchemy 中编写了一些工作正常的东西,但是在 Flask 中执行它们时,相同的工作流/命令似乎是歪斜的。例如,这些类型的行被标记为“未定义”:

metadata = MetaData(db)

abc = Table('abc', metadata, autoload=True)

s = select([abc.name])

我在顶部确实有 from flask.ext.sqlalchemy import SQLAlchemy

还有什么我需要做的补充或替代的吗?

(供参考,我在pythonanywhere运行)

【问题讨论】:

  • 您在虚拟环境中安装了 SQLAlchemy 吗?
  • 这种行为显然是由于试图将flask_sqlachemy 视为“本机”或“真实”sqlalchemy 而显然不是。 flask_sqlachemy documentation 中的任何地方都没有推荐或记录您使用的代码。我同意如果明确标记差异会有所帮助 - 我第一次使用 Flask 时犯了同样的错误。

标签: python flask sqlalchemy pythonanywhere


【解决方案1】:

导入SQLAlchemy 不会让您直接访问该模块内的名称。您还应该知道,使用flask_sqlalchemy(以前的flask.ext.sqlalchemy)模块使用稍微不同的机制来访问SQLAlchemy 功能。这意味着任何转移您当前对SQLAlchemy 的知识的尝试都应该通过对flask_sqlalchemy documentation 的研究来了解。

通常,您将创建一个 Flask 应用程序,然后将其传递给SQLAlchemyas in this example 的调用。相关代码如下所示。

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)

db 对象现在具有ModelColumn 和各种数据类型作为属性,因此您可以通过以下方式定义表/模型。

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(120), unique=True)

    def __init__(self, username, email):
        self.username = username
        self.email = email

    def __repr__(self):
        return '<User %r>' % self.username

我个人不喜欢这种特殊的访问模型,因为它迫使我限定 db 命名空间中的各种名称,而不是简单地从模块中导入它们并不加限定地使用它们,但它似乎有效(至少对于相对简单的数据库)。

如果您是一位经验丰富的 SQLAlchemy 用户,您可能需要考虑使用标准访问机制,但这可能会使您容易受到由于意外线程/Web 会话交互而导致的细微错误的影响。我还听说部署多个数据库可能很棘手。我没有这方面的直接证据,所以请把它当作轶事。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 2012-02-05
    • 2016-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多