我想使用 Flask-SQLAlchemy 建立一个 sqlite 数据库。我收到一个操作错误(sqlite3.OperationalError) no such table。
这是一个用 Flask 编写的 Web 应用程序。我想使用 Flask-SQLAlchemy 扩展与数据库交互。我觉得这可能与应用程序上下文有关,但我不确定。
如您所见,该应用程序有一个“模块”(auth子包)。该模块通过蓝图注册到应用程序。我在子包Researcher的models.py文件中定义了类的模型auth。app/__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)
from flask import Flask, render_template …Run Code Online (Sandbox Code Playgroud) 我已阅读文档并搜索了此站点,但似乎无法找到按声明顺序对字段值进行排序的解决方案。文档指出,添加ordered = True到class 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?谢谢!
在我当前的设置中,如果我执行五个 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 做到这一点?
我正在使用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) 在我的应用程序中,一个“集合”可以有许多与之关联的“产品”。针对一组列出的产品必须定义数量。对于这种多对多关系,我遵循了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)我的观点瓶函数来处理表单数据,在我的问题描述在这里 …
当我有多个模型时,我对如何使用 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 对象并将其导入我的所有模型中吗?
我有一个数据库,我需要返回与查询匹配或看起来相似的任何值。
使用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) 我正在尝试将表从纯 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
我有 2 个表(比如Student和College)和第三个表(StudentCollege),其中有student_id和college_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)
但它给出了编程错误。
现在我有一个应用程序可以将用户的数据写入名为 users.sql 的数据库文件。但是,我通过github将其推送到heroku,并且数据不粘。如果过了一段时间,heroku 将休眠,并且在检测到另一个登录时必须重新部署所有文件。我听说我可以将 heroku postgres 添加为 heroku 的插件,但我不确定如何将其与我当前的代码集成。我该怎么做才能设置它?
flask-sqlalchemy ×10
python ×7
sqlalchemy ×6
flask ×5
foreign-keys ×1
heroku ×1
many-to-many ×1
marshmallow ×1
nginx ×1
python-3.x ×1
uwsgi ×1