我想创建一个可为空的自引用关系,可以使用 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)
其中joe和larry都是Person对象。然而,经过uselist论证,joe.partner现在其实是一个Person没有remove办法的事情。
重新构建 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) 我收到以下语句的语法错误,问题部分是(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 表达式。帮助表示感谢!
我有这门课:
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 更新其值时验证表列?
谢谢 :)
在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)
这使得表格不是模型本身
我正在努力编写py.test fixtures来管理我的应用程序数据库,以最大限度地提高速度,支持pytest-xdist测试的并行化,并将测试彼此隔离开来.
我正在对PostgreSQL 9.4数据库使用Flask-SQLAlchemy 2.1.
以下是我要完成的大致概述:
$ py.test -n 3 旋转三个测试会话以运行测试.
在每个会话中,py.test fixture运行一次以设置事务,创建数据库表,然后在会话结束时回滚事务.创建数据库表需要在PostgreSQL事务中发生,该事务仅对该特定测试会话可见,否则由pytest-xdist原因创建的并行化测试会话会相互冲突.
为每个测试运行的第二个py.test fixture连接到现有事务,以便查看创建的表,创建嵌套保存点,运行测试,然后回滚到嵌套保存点.
理想情况下,这些pytest灯具支持调用的测试db.session.rollback().在这个SQLAlchemy文档的底部有一个潜在的配方来完成这个.
理想情况下,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) 我有一个Flask项目,通过Flask-SQLAlchemy与MySQL数据库交互.
我的问题是,如何根据值或其他值从数据库中选择一行.
SELECT id FROM users WHERE email=email OR name=name;
Run Code Online (Sandbox Code Playgroud)
如何在Flask-SQLAlchemy中实现这一目标?
我正在构建一个 api,如果用户请求它可以返回资源的子级。例如,user有messages. 我希望查询能够限制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) 我正在寻找一种方法来实际获得flask-sqlalchemy的智能感知。我在网上找到的所有答案似乎都告诉我们如何抑制错误(没有 Column 或查询实例成员)(切换 linters,忽略 pylintrc 中的类等...),但我发现很难相信python 中最广泛使用的 ORM 实际上没有 linting 支持。
我愿意使用 pycharm 或 intellij 社区版本,但我更愿意坚持使用 vs 代码,因为我是一名最近决定学习 Python 的 js 开发人员,并且我想坚持使用我熟悉和喜爱的工具。我听说 vs code 有很好的 python 支持,但是 sqlalchemy linting 是必须的!
我需要为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,我收到一条错误消息:
烧瓶不是内部或外部命令,也不是可运行的程序或批处理文件
为什么这不起作用?我一直在努力解决这个问题,但我仍然有同样的错误信息。可能是什么问题?
flask-sqlalchemy ×10
python ×8
sqlalchemy ×8
flask ×3
declarative ×1
limit ×1
mysql ×1
postgresql ×1
pycharm ×1
pytest ×1
python-3.x ×1