标签: flask-sqlalchemy

如何删除与 SQLAlchemy 的一对一关系

我想创建一个可为空的自引用关系,可以使用 SQLAlchemy 删除该关系。示例模型如下(注意,使用Flask-SQLAlchemy):

class Person(db.Model):

    __tablename__ = 'person'

    id          = db.Column(db.Integer, primary_key=True)
    partner_id  = db.Column(db.Integer, db.ForeignKey('person.id'), nullable=True)
    partner     = db.relationship('Person', uselist=False)
Run Code Online (Sandbox Code Playgroud)

因此,可以将其想象为一桌只有一个搭档的警察,但该搭档可能原来一直是黑手党的成员,因此他们暂时失去了搭档。没有伴侣的警察很好,至少在数据库方面是这样——但我认为在整个演出过程中,他们没有伴侣的状态意味着大量的财产损失。

不用说,这个问题:sqlalchemy:带有声明性的一对一关系讨论了如何建立这种关系。问题是如何解除这种关系?通常,使用不同的外键,您可以按如下方式执行此操作:

joe.partner.remove(larry)
Run Code Online (Sandbox Code Playgroud)

其中joelarry都是Person对象。然而,经过uselist论证,joe.partner现在其实是一个Person没有remove办法的事情。

python sqlalchemy flask-sqlalchemy

10
推荐指数
1
解决办法
2769
查看次数

flask_sqlalchemy:`__setattr__` 到 `DefaultMeta` 的错误

重新构建 Docker 映像后,我开始收到以下错误:

$ docker run --rm -it python:3.8-slim /bin/bash
...
$ pip install flask_sqlalchemy
...
$ python -c "from flask_sqlalchemy import SQLAlchemy; SQLAlchemy()"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/local/lib/python3.8/site-packages/flask_sqlalchemy/__init__.py", line 715, in __init__
    self.Model = self.make_declarative_base(model_class, metadata)
  File "/usr/local/lib/python3.8/site-packages/flask_sqlalchemy/__init__.py", line 797, in make_declarative_base
    model.query_class = self.Query
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/ext/declarative/api.py", line 79, in __setattr__
    _add_attribute(cls, key, value)
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/ext/declarative/base.py", line 802, in _add_attribute
    type.__setattr__(cls, key, value)
TypeError: can't apply this __setattr__ to DefaultMeta object …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy flask-sqlalchemy

10
推荐指数
1
解决办法
845
查看次数

正确的 sqlalchemy 代码的 pycharm 语法错误?

我收到以下语句的语法错误,问题部分是(Player.name == data["name"]) | (Player.account == data["account"]))

player_from_db = db.session.execute(
    select(Player).where(
             (Player.name == data["name"]) | 
             (Player.account == data["account"])
    )).scalar()
Run Code Online (Sandbox Code Playgroud)

这是错误:

预期类型 'Union[ColumnElement[bool], _HasClauseElement, SQLCoreOperations[bool], ExpressionElementRole[bool], () -> ColumnElement[bool], LambdaElement]',却得到 'Union[bool, int]'

但该子句显然有两个 bool 表达式。帮助表示感谢!

python sqlalchemy pycharm python-3.x flask-sqlalchemy

10
推荐指数
0
解决办法
2934
查看次数

更新 sqlalchemy orm 时的验证不起作用

我有这门课:

class User(base):
    __tablename__='User'
    name = Column(.......

    def __init__(self, name):
        self.name = name

    @validates('name')
    def validate_name(self, key, name):
        if blah blah blah:
            return name
        else:
            raise exception.....
Run Code Online (Sandbox Code Playgroud)

创建一个新用户并将他存储在数据库中...

if __name__ == '__main__':
    user = User('foo')
    session.add(user)
    session.commit() #validation works here
Run Code Online (Sandbox Code Playgroud)

更新用户时:

if __name__ == '__main__':
    user = session.query(User).filter_by(name=='foo').first()
    user.name = 'bar'
    session.add(user)
    session.commit() #validation not working here
Run Code Online (Sandbox Code Playgroud)

存储新用户时,验证有效,但更新现有用户时,验证无效

问:如何在使用@validates 更新其值时验证表列?

谢谢 :)

python sqlalchemy flask-sqlalchemy

9
推荐指数
1
解决办法
464
查看次数

从flask-sqlalchemy db获取所有模型

在SQLAlchemy中构建数据库之后,我想得到所有模型,也就是代表它们的类

>>> db
<SQLAlchemy engine='postgresql:///example'>
>>> ???
[<db.Model 'User'>, <db.Model 'Comment'>, <db.Model 'Article'>]
Run Code Online (Sandbox Code Playgroud)

这可以实现吗?怎么样?

我可以很好地得到表格,而不是模型.例如:

>>> for t in db.metadata.tables.items():
        print(t)
Run Code Online (Sandbox Code Playgroud)

这使得表格不是模型本身

sqlalchemy flask flask-sqlalchemy

9
推荐指数
3
解决办法
7848
查看次数

如何将py.test fixtures与Flask-SQLAlchemy和PostgreSQL结合起来?

我正在努力编写py.test fixtures来管理我的应用程序数据库,以最大限度地提高速度,支持pytest-xdist测试的并行化,并将测试彼此隔离开来.

我正在对PostgreSQL 9.4数据库使用Flask-SQLAlchemy 2.1.

以下是我要完成的大致概述:

  1. $ py.test -n 3 旋转三个测试会话以运行测试.

  2. 在每个会话中,py.test fixture运行一次以设置事务,创建数据库表,然后在会话结束时回滚事务.创建数据库表需要在PostgreSQL事务中发生,该事务仅对该特定测试会话可见,否则由pytest-xdist原因创建的并行化测试会话会相互冲突.

  3. 为每个测试运行的第二个py.test fixture连接到现有事务,以便查看创建的表,创建嵌套保存点,运行测试,然后回滚到嵌套保存点.

  4. 理想情况下,这些pytest灯具支持调用的测试db.session.rollback().在这个SQLAlchemy文档的底部有一个潜在的配方来完成这个.

  5. 理想情况下,pytest fixtures应该产生db对象,而不仅仅是会话,以便人们可以编写测试而不必记住使用与db.session他们在整个应用程序中使用的标准不同的会话.

这是我到目前为止所拥有的:

import pytest

# create_app() is my Flask application factory
# db is just 'db = SQLAlchemy()' + 'db.init_app(app)' within the create_app() function
from app import create_app, db as _db 


@pytest.yield_fixture(scope='session', autouse=True)
def app():
    '''Session-wide test application'''
    a = create_app('testing')
    with a.app_context():
        yield a

@pytest.yield_fixture(scope='session')
def db_tables(app):
    '''Session-wide test database''' …
Run Code Online (Sandbox Code Playgroud)

postgresql sqlalchemy pytest flask flask-sqlalchemy

9
推荐指数
1
解决办法
3821
查看次数

Flask SQLAlchemy按值或其他值过滤

我有一个Flask项目,通过Flask-SQLAlchemy与MySQL数据库交互.

我的问题是,如何根据值或其他值从数据库中选择一行.

我在SQL中想要的结果看起来像这样

SELECT id FROM users WHERE email=email OR name=name;
Run Code Online (Sandbox Code Playgroud)

如何在Flask-SQLAlchemy中实现这一目标?

python mysql flask-sqlalchemy

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

在初始查询 sqlalchemy 中限制子集合

我正在构建一个 api,如果用户请求它可以返回资源的子级。例如,usermessages. 我希望查询能够限制message返回的对象数量。

我发现了一个有用的技巧aboutl imiting在子集合对象的数量在这里。基本上,它表示以下流程:

class User(...):
    # ...
    messages = relationship('Messages', order_by='desc(Messages.date)', lazy='dynamic')

user = User.query.one()
users.messages.limit(10)
Run Code Online (Sandbox Code Playgroud)

我的用例涉及有时会返回大量用户。

如果我要遵循该链接中的建议并使用,.limit()那么我将需要遍历调用.limit()每个用户的整个用户集合。这比LIMIT在创建集合的原始 sql 表达式中使用效率低得多。

我的问题是,是否有可能使用声明来有效地(N+0)加载大量对象,同时使用 sqlalchemy 限制其子集合中的子集合的数量?

更新

需要明确的是,以下是我试图避免的

users = User.query.all()
messages = {}
for user in users:
    messages[user.id] = user.messages.limit(10).all()
Run Code Online (Sandbox Code Playgroud)

我想做一些更像:

users = User.query.option(User.messages.limit(10)).all()
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy declarative limit flask-sqlalchemy

9
推荐指数
1
解决办法
3446
查看次数

烧瓶 sqlalchemy 智能感知/自动完成

我正在寻找一种方法来实际获得flask-sqlalchemy的智能感知。我在网上找到的所有答案似乎都告诉我们如何抑制错误(没有 Column 或查询实例成员)(切换 linters,忽略 pylintrc 中的类等...),但我发现很难相信python 中最广泛使用的 ORM 实际上没有 linting 支持。

我愿意使用 pycharm 或 intellij 社区版本,但我更愿意坚持使用 vs 代码,因为我是一名最近决定学习 Python 的 js 开发人员,并且我想坚持使用我熟悉和喜爱的工具。我听说 vs code 有很好的 python 支持,但是 sqlalchemy linting 是必须的!

python sqlalchemy flask-sqlalchemy visual-studio-code

9
推荐指数
0
解决办法
2957
查看次数

在 Windows 上运行 Flask 不会执行 flask run 命令

我需要为windows设置flask,所以我在cmd中写了以下代码

set FLASK_APP=application.py
set FLASK_DEBUG=1
set DATABASE_URL='postgres.......' =>(the credential given by the Heroku account)
flask run
Run Code Online (Sandbox Code Playgroud)

但是当我按下回车键时flask run,我收到一条错误消息:

烧瓶不是内部或外部命令,也不是可运行的程序或批处理文件

为什么这不起作用?我一直在努力解决这个问题,但我仍然有同样的错误信息。可能是什么问题?

python flask flask-sqlalchemy

9
推荐指数
2
解决办法
2万
查看次数