标签: flask-sqlalchemy

如何让 Flask-SQLAlchemy 使用应用程序工厂模式

我想使用 Flask-SQLAlchemy 建立一个 sqlite 数据库。我收到一个操作错误(sqlite3.OperationalError) no such table

这是一个用 Flask 编写的 Web 应用程序。我想使用 Flask-SQLAlchemy 扩展与数据库交互。我觉得这可能与应用程序上下文有关,但我不确定。

如您所见,该应用程序有一个“模块”(auth子包)。该模块通过蓝图注册到应用程序。我在子包Researchermodels.py文件中定义了类的模型authapp/__init__.py保存应用程序工厂和数据库初始化。因为我只是想让基本功能正常工作,所以我仅有的两个视图是在app/auth/routes.py.


.
|-- app
|   |-- __init__.py
|   |-- auth
|   |   |-- __init__.py
|   |   |-- __pycache__
|   |   |-- models.py
|   |   `-- routes.py
|   |-- static
|   `-- templates
|-- app.db
|-- config.py
|-- instance
|   `-- config.py
`-- run.py
Run Code Online (Sandbox Code Playgroud)

应用程序/初始化.py

from flask import Flask, render_template …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy flask flask-sqlalchemy

3
推荐指数
1
解决办法
6975
查看次数

Marshmallow - 按声明的顺序对字段值进行排序

我已阅读文档并搜索了此站点,但似乎无法找到按声明顺序对字段值进行排序的解决方案。文档指出,添加ordered = Trueclass Meta将解决这个问题 -

class MySchema(Schema):
    class Meta:
        ordered = True
Run Code Online (Sandbox Code Playgroud)

但是,我没有class Meta在我的架构中使用。我的架构看起来就像 -

class MySchema(Schema):    
    id = fields.Integer()
    name = fields.Str() 
    category = fields.Str()
Run Code Online (Sandbox Code Playgroud)

那么在这种情况下,我将如何以及在哪里设置ordered = True?谢谢!

flask-sqlalchemy marshmallow

3
推荐指数
1
解决办法
1567
查看次数

您可以并行运行多个 Flask SQLAlchemy 查询吗?

在我当前的设置中,如果我执行五个 100 毫秒的查询,它们总共需要 500 毫秒。有没有办法可以并行运行它们,只需要 100 毫秒?

我在 nginx/uwsgi 后面运行 Flask,但可以更改其中任何一个。

具体来说,我希望能够从这里转换代码:

result_1 = db.session.query(...).all()
result_2 = db.session.query(...).all()
result_3 = db.session.query(...).all()
Run Code Online (Sandbox Code Playgroud)

对于这样的事情:

result_1, result_2, result_3 = run_in_parallel([
  db.session.query(...).all(),
  db.session.query(...).all(),
  db.session.query(...).all(),
])
Run Code Online (Sandbox Code Playgroud)

有没有办法用 Flask 和 SQLAlchemy 做到这一点?

sqlalchemy nginx flask uwsgi flask-sqlalchemy

3
推荐指数
1
解决办法
3249
查看次数

Flask-SQLAlchemy - 检索 Query.all() - 每行中的所有列

我正在使用flask_SQLAlchemy 和Postgres DB 运行Flask 应用程序。

我想打印()使用 query.all() 检索的行的所有列值

我已通读此文档,但无法检索到我要查找的内容。https://docs.sqlalchemy.org/en/13/orm/query.html 不过 我是 Alchemy 的新手。

# the class model
class Users(db.Model):
    __tablename__ = "users"
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String, nullable=False)
    hash = db.Column(db.String, nullable=False)
    reg_date = db.Column(db.DateTime, nullable=False)
    enabled = db.Column(db.Boolean, nullable=False

# Query all users
users = Users.query.all()

# try to iterate
for row in users:
    print(row.all())
Run Code Online (Sandbox Code Playgroud)
actual results:
before loop: 
    >>> <Users 1>, <Users 2>, <Users 3>, <Users 4>
after loop: 
    >>> error all() doesn't apply to …
Run Code Online (Sandbox Code Playgroud)

python flask-sqlalchemy

3
推荐指数
1
解决办法
1万
查看次数

SQLAlchemy 多对多关系更新带有额外列的关联对象

在我的应用程序中,一个“集合”可以有许多与之关联的“产品”。针对一组列出的产品必须定义数量。对于这种多对多关系,我遵循了SQLAlchemy 文档以使用带有附加列(数量)的关联表。

我正在尝试创建一个表单,用户可以在其中根据给定的集合分配产品和数量。数据库中已存在套装和产品。表格中的数据是:

  • 设置名称
  • 产品编号
  • 数量

这可以创建一个新的关联(例如,第 1 组“链接”到数量 = XYZ 的产品 3),但是当我尝试更新现有记录时出现完整性错误。

我可以手动添加关系/记录(虚拟数据)或在 Flask 视图函数中,如下所示:

s = Set.query.get(2)
p = Product.query.get(3)
a = Set_Product_Association(set=s, product=p, quantity=23)
db.session.add(a)
db.session.commit()
Run Code Online (Sandbox Code Playgroud)

手动更新记录(不同数量)如下工作:

s.products[0].quantity = 43
db.session.add(s)
db.session.commit()
Run Code Online (Sandbox Code Playgroud)

但是,当我使用第一个块中的代码时(目的是更新quantity给定的现有集合和产品 ID的字段),即:

a = Set_Product_Association(set=s, product=p, quantity=43)
Run Code Online (Sandbox Code Playgroud)

我收到完整性错误

sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) UNIQUE constraint failed: set_product_association.set_id, set_product_association.product_id [SQL: 'INSERT INTO set_product_association (set_id, product_id, quantity) VALUES (?, ?, ?)'] [parameters: (2, 3, 43)]
Run Code Online (Sandbox Code Playgroud)

我认为这是告诉我我正在尝试添加新记录而不是更新现有记录。

我应该如何处理这个问题?“手动”方法有效,但依赖于在列表中计算出正确的索引(即正确的 product.id)。

奇怪的是,如果我用form.popluate_obj(set)我的观点瓶函数来处理表单数据,在我的问题描述在这里 …

many-to-many sqlalchemy flask flask-sqlalchemy

3
推荐指数
1
解决办法
1843
查看次数

对多个文件中的模型使用 Flask-migrate

当我有多个模型时,我对如何使用 Flask-Migrate 感到困惑。基本上我的 Flask 应用程序如下所示:

app
??? __init__.py
??? config.py
??? manage.py
??? migrations
??? models
?   ??? model1.py
?   ??? model2.py
??? resources
??? run.py
??? tests
Run Code Online (Sandbox Code Playgroud)

我已经读过,对于每个模型,最好db = SQLAlchemy()在文件中创建对象,然后将此 db 对象导入应用程序,__init__.py如下所示:

from models.model1 import db
db.init_app(app)
from models.model2 import db
db.init_app(app)
Run Code Online (Sandbox Code Playgroud)

但是,如果我对多个模型文件执行此操作,考虑到我只能使用 1 个 sql alchemy 对象进行 migrate 类实例化,我该如何添加 Flasks 的迁移功能:

migrate = Migrate(app, db)
manager = Manager(app)
manager.add_command('db', MigrateCommand)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,最好在__init__.py文件中定义一个 sql alchemy 对象并将其导入我的所有模型中吗?

python flask python-3.x flask-sqlalchemy flask-migrate

3
推荐指数
1
解决办法
3339
查看次数

SQLAlchemy - 在整个数据库模型列中搜索模式

我有一个数据库,我需要返回与查询匹配或看起来相似的任何值。

使用flask-sqlalchemy我可以手动过滤,但我无法使用列表推导式或任何其他更多 Pythonic 方法获取对象列表。

我已经尝试使用所有模型列(我有一个列表)和传递给filter_by查询的搜索值创建一个字典

column_dict_and_value = {column_name:'value' for column_name in columns}    
a = model.query.filter_by(**column_dict_and_value).all()
Run Code Online (Sandbox Code Playgroud)

...但甚至不返回现有对象,虽然

a = model.query.filter_by(column_name='value').all()
Run Code Online (Sandbox Code Playgroud)

实际上返回对象。

我试过了filter(.like('%')),它有点工作

a = model.query.filter(model.column_name.like('valu%')).all()
Run Code Online (Sandbox Code Playgroud)

返回与该模式匹配但针对该列的所有对象的列表,我想遍历所有列。基本上是一个完整的搜索,因为我不确定用户要查找什么,如果查询存在于任何列中,我想显示对象,或者如果查询不完整,则显示对象列表,例如任何搜索中的 * .

我尝试使用列表推导来遍历模型属性,但显然不允许这样做:

a = [model.query.filter(model.column.like('valu%')) for column in columns]
Run Code Online (Sandbox Code Playgroud)

...这抱怨列不是模型的属性,由于语法原因,这是有道理的,但无论如何我都必须尝试,innit?

我是数据库和类对象的新手,所以请保持温和。我试图寻找类似的答案,但找不到适合我的答案。这filter_by(one_column, second_column, etc)在我看来不是很 Pythonic,如果出于任何原因我更改模型,我也需要更改查询,因为创建模型的 dict 理解在我看来更万无一失。

解决方案

根据calestini建议的答案,我编写了这段似乎可以解决问题的代码。它还清理列表,因为如果all()没有任何结果(因为它在每个字段中查找)它返回 None 并添加到列表中。我宁愿它干净。

注意:我所有的字段都是文本。如果您的不同,请查看 calestini 提出的第三个解决方案。虽然没有测试过。

columns = [
"foo",
"bar",
"foobar"
]


def list_everything(search):
d = {column: search for column in columns}
raw …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy flask-sqlalchemy

3
推荐指数
1
解决办法
2424
查看次数

Flask-Sqlalchemy:具有 3 个主键也是外键的表

我正在尝试将表从纯 SQL 转换为 Flask-Sqlalchemy,但是可用的文档并不清楚如何执行此特定场景 - 主键也是外键。

构建表的 SQL 如下所示,它工作正常:

CREATE TABLE IF NOT EXISTS `ws`.`Perfil_Plano_Transacao` (
    `pptr_perf_id` INT NOT NULL,
    `pptr_tran_id` INT NOT NULL,
    `pptr_plan_id` INT NOT NULL,
    `pptr_dt_incluscao` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `pptr_dt_atualizacao` TIMESTAMP NULL,
PRIMARY KEY (`pptr_perf_id`, `pptr_tran_id`, `pptr_plan_id`),
INDEX `fk_Perfil_Plano_Transacao_Transacao1_idx` (`pptr_tran_id` ASC),
INDEX `fk_Perfil_Plano_Transacao_Plano1_idx` (`pptr_plan_id` ASC),
CONSTRAINT `fk_Perfil_Plano_Transacao_Perfil1`
    FOREIGN KEY (`pptr_perf_id`)
    REFERENCES `ws`.`Perfil` (`perf_id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
CONSTRAINT `fk_Perfil_Plano_Transacao_Transacao1`
    FOREIGN KEY (`pptr_tran_id`)
    REFERENCES `ws`.`Transacao` (`tran_id`)
    ON DELETE NO ACTION
    ON UPDATE …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy foreign-keys composite-primary-key flask-sqlalchemy

3
推荐指数
1
解决办法
3438
查看次数

将查询输出作为输入传递给 SQLAlchemy 中另一个查询的 in 子句

我有 2 个表(比如StudentCollege)和第三个表(StudentCollege),其中有student_idcollege_id外键。

我想给出以下查询的输出:

list = (
    db.session.query(StudentCollegeModel.College_id)
    .filter(StudentCollegeModel.student_id== student_id)
    .all()
)
Run Code Online (Sandbox Code Playgroud)

以下查询:

(
    db.session.query(CollegeModel)
    .filter(CollegeModel.College_id.in_(list))
    .all()
)
Run Code Online (Sandbox Code Playgroud)

但它给出了编程错误。

python sqlalchemy flask-sqlalchemy

3
推荐指数
1
解决办法
813
查看次数

如何将 Heroku Postgres 与我的flask-sqlalchemy 应用程序一起使用?

现在我有一个应用程序可以将用户的数据写入名为 users.sql 的数据库文件。但是,我通过github将其推送到heroku,并且数据不粘。如果过了一段时间,heroku 将休眠,并且在检测到另一个登录时必须重新部署所有文件。我听说我可以将 heroku postgres 添加为 heroku 的插件,但我不确定如何将其与我当前的代码集成。我该怎么做才能设置它?

python heroku flask flask-sqlalchemy

3
推荐指数
1
解决办法
1343
查看次数