我正在尝试使用flask构建和应用程序,我看过一些教程和书籍以及一些代码[1],它们解释了如何为数据库设置声明整数和字符串。但是,它们没有解释如何存储图像。我现在很困惑,虽然存储图像的自然方式是在数据库中,但是阅读flask站点[2]上的一些文档,文件系统是存储图像的地方。我只是在阅读 Flask 开发书籍时做出第一个假设,即使用 largeBinary 的声明将是正确的,但这只是我的猜测,正如您在下面的代码中所见。有人可以帮我解决这个问题吗?如果我问的不清楚,请告诉我。
Class User(Base):
__table__ = 'user'
id = Column(Integer, primary_key = True)
name Column(String(80), nullable=False)
email = Column(String(250), nullable=False)
image = Column(LargeBinary, nullable = True)
Run Code Online (Sandbox Code Playgroud)
[1] https://github.com/lobrown/Full-Stack-Foundations/blob/master/Lesson_1/database_setup.py [2] http://flask.pocoo.org/docs/0.10/patterns/fileuploads/
我定义了一个 SqlAlchemy 模型
from sqlalchemy.dialects.postgresql import JSONB
class User(db.Model):
__tablename__ = "user"
id = db.Column(db.Integer, primary_key=True)
nickname = db.Column(db.String(255), nullable=False)
city = db.Column(db.String(255))
contact_list = db.Column(JSONB)
created_at = db.Column(db.DateTime, default=datetime.utcnow)
def add_user():
user = User(nickname="Mike")
user.contact_list = [{"name": "Sam", "phone": ["123456", "654321"]},
{"name": "John", "phone": ["159753"]},
{"name": "Joe", "phone": ["147889", "98741"]}]
db.session.add(user)
db.session.commit()
if __name__ == "__main__":
add_user()
Run Code Online (Sandbox Code Playgroud)
如何使用电话从我的contact_list 中检索姓名?例如,我有147889,我如何检索Joe?
我试过这个
User.query.filter(User.contact_list.contains({"phone": ["147889"]})).all()
但是,它返回给我一个空列表, []
我怎样才能做到这一点?
我有两个SQLAlchemy模型设置如下:
##############
# Post Model #
##############
class Post(db.Model):
id = db.Column(db.Integer, primary_key = True)
title = db.Column(db.String(250))
content = db.Column(db.String(5000))
timestamp = db.Column(db.Integer)
author_id = db.Column(db.Integer, db.ForeignKey('user.id'))
likes = db.relationship('Like', backref = 'post', lazy = 'dynamic')
###############
# Likes Model #
###############
class Like(db.Model):
id = db.Column(db.Integer, primary_key = True)
voter_id = db.Column(db.Integer, db.ForeignKey('user.id'))
post_id = db.Column(db.Integer, db.ForeignKey('post.id'))
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,这些帖子上有帖子模型和用户喜欢的模型.我想创建一个选择所有帖子的查询,按照帖子的喜欢数量排序.在shell中,我可以运行:
SELECT post.*,
count(like.id) AS num_likes
FROM post
LEFT JOIN like
ON post.id = like.post_id
GROUP BY post.id;
Run Code Online (Sandbox Code Playgroud)
什么是等效的SQLAlchemy命令?
谢谢!
我正在使用Flask,Alembic和PostgreSQL与SQLAlchemy.我有location_messages一个列的现有表campaign_id.这是最初在模型中使用代码创建的
campaign_id = db.Column(db.Integer)
Run Code Online (Sandbox Code Playgroud)
我想为它添加一个外键,所以我更新了模型
campaign_id = db.Column(db.Integer, db.ForeignKey('campaigns.id'))
Run Code Online (Sandbox Code Playgroud)
我跑了revision --autogenerate但它没有创建任何东西 - 所以我一直在查看文档,但我不能理解我的用法语法.对于它的价值,在Alembic中从头开始创建表(放下它之后)是
op.create_table('location_messages',
[...]
sa.Column('campaign_id', sa.Integer(), nullable=True),
sa.ForeignKeyConstraint(['campaign_id'], ['campaigns.id'], ),
sa.PrimaryKeyConstraint('id')
)
Run Code Online (Sandbox Code Playgroud)
但对于我的生活,我找不到一种方法来为现有的桌子做这件事.有没有办法获取表的实例并将其分配ForeignKeyConstraint给列?
我想创建一个可为空的自引用关系,可以使用 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办法的事情。
使用 Flask-SQLAlchemy,我想Questions根据另一个表的值删除表中的行,该表链接到表Topic,然后Subject用外键链接到表。我试过这个查询:
db.session.query(Questions).join(Topic)join(Subject).filter(Subject.account_id==current_user.id).delete()
Run Code Online (Sandbox Code Playgroud)
但是,我收到一个错误:
InvalidRequestError: Can't call Query.update() or Query.delete() when join(), outerjoin(), select_from(), or from_self() has been called
Run Code Online (Sandbox Code Playgroud)
所以从这个我想我不能用.delete()同.join()
这个问题有解决方法吗?谢谢。
我正在研究烧瓶中的小休息api.Api具有注册请求并生成单独线程以在后台运行的路由.这是代码:
def dostuff(scriptname):
new_thread = threading.Thread(target=executescript,args=(scriptname,))
new_thread.start()
Run Code Online (Sandbox Code Playgroud)
线程启动但是当我尝试从executioncript函数插入db时它会出错.它抱怨db对象没有在应用程序中注册.
我正在动态创建我的应用程序(使用api作为Blueprint).
这是应用程序的结构
-run.py ## runner script
-config
-development.py
-prod.py
-app
-__init__.py
- auth.py
- api_v1
- __init__.py
- routes.py
- models.py
Run Code Online (Sandbox Code Playgroud)
这是我的跑步者脚本run.py:
from app import create_app, db
if __name__ == '__main__':
app = create_app(os.environ.get('FLASK_CONFIG', 'development'))
with app.app_context():
db.create_all()
app.run()
Run Code Online (Sandbox Code Playgroud)
以下是app/__init__.py创建应用程序的代码:
from flask import Flask, jsonify, g
from flask.ext.sqlalchemy import SQLAlchemy
db = SQLAlchemy()
def create_app(config_name):
"""Create an application instance."""
app = Flask(__name__)
# apply configuration
cfg = os.path.join(os.getcwd(), …Run Code Online (Sandbox Code Playgroud) 我正在尝试以编程方式构建搜索查询,为此,我正在加入一个表.
class User(db.Model):
id = db.Column(db.Integer(), primary_key=True)
class Tag(db.Model):
id = db.Column(db.Integer(), primary_key=True)
user_id = db.Column(db.Integer(), db.ForeignKey('user.id'))
title = db.Column(db.String(128))
description = db.Column(db.String(128))
Run Code Online (Sandbox Code Playgroud)
这是一个人为的例子 - 我希望它有意义.
说我的搜索功能看起来像:
def search(title_arg, desc_arg):
query = User.query
if title_arg:
query = query.join(Tag)
query = query.filter(Tag.title.contains(title_arg))
if desc_arg:
query = query.join(Tag)
query = query.filter(Tag.description.contains(desc_arg))
return query
Run Code Online (Sandbox Code Playgroud)
以前,我一直跟踪已经在列表中加入的表,如果表在列表中,假设它已经加入,只需添加过滤器.
如果我可以查看查询对象,看看它Tag已经加入了,那就太酷了,如果是的话就跳过它.我有一些更复杂的查询构建,真正从中受益.
如果对于我错过的搜索构建查询的策略完全不同,那也会很棒.或者,如果上面的代码没问题,如果我两次加入表格,这也是很好的信息.任何帮助都非常感激!!!
重新构建 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 表达式。帮助表示感谢!
flask-sqlalchemy ×10
python ×9
sqlalchemy ×8
flask ×4
alembic ×1
database ×1
join ×1
pycharm ×1
python-3.x ×1
sqlite ×1