我正在使用 Flask 和 PostgreSQL 数据库以及 SQLAlchemy 进行一个项目。
我有一个Group对象,其中User包含一组成员的 ID。出于某种原因,当我尝试将 ID 添加到组时,它无法正确保存。
如果我尝试members.append(user_id),它似乎根本不起作用。但是,如果我尝试members += [user_id],该 id 将显示在列出所有组的视图中,但是如果我重新启动服务器,则添加的值不存在。然而,初始值是。
相关代码:
最初将组添加到数据库:
db = SQLAlchemy(app)
# ...
g = Group(request.form['name'], user_id)
db.session.add(g)
db.session.commit()
Run Code Online (Sandbox Code Playgroud)
组类:
from flask.ext.sqlalchemy import SQLAlchemy
from sqlalchemy.dialects.postgresql import ARRAY
class Group(db.Model):
__tablename__ = "groups"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(128))
leader = db.Column(db.Integer)
# list of the members in the group based on user id
members = db.Column(ARRAY(db.Integer))
def __init__(self, name, leader): …Run Code Online (Sandbox Code Playgroud) 这个问题是“在 Flask-SQLAlchemy 中过滤关系和分页”的简化,这里的答案也可能会产生一个解决方案。
假设我有一个简单的模型类 Design:
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
app = Flask(__name__)
db = SQLAlchemy(app)
class Design(db.Model):
__tablename__ = 'design'
id = db.Column(db.Integer, primary_key=True)
designname = db.Column(db.String(64))
Run Code Online (Sandbox Code Playgroud)
我可以得到一个 Flask-SQLAlchemy BaseQuery 对象,如下所示:
>>> Design.query
<flask_sqlalchemy.BaseQuery object at 0x7f0b29c63990>
Run Code Online (Sandbox Code Playgroud)
我可以如您所愿地取回数据:
>>> Design.query.all()
[<item1>, <item2>, <item3>]
Run Code Online (Sandbox Code Playgroud)
我也可以通过这种方式获取 BaseQuery 对象(我认为这对于更复杂的查询是必要的,例如,带有连接的查询):
>>> db.Query(Design)
<flask_sqlalchemy.BaseQuery object at 0x7f0b29c6fdd0>
Run Code Online (Sandbox Code Playgroud)
看起来它应该是相同的对象类型 - 实际上,生成的 SQL 是相同的:
>>> str(db.Query(Design)) == str(Design.query)
True
Run Code Online (Sandbox Code Playgroud)
然而,当我在这里尝试 all() 方法时,它不起作用:
>>> db.Query(Design).all()
Traceback (most recent call last):
File "<debugger>", …Run Code Online (Sandbox Code Playgroud) 问题是当用户尝试“忘记密码”选项时。它reset_key为验证创建新的,但新的密钥没有更新到数据库中。
@app.route('/login/forgot/', methods=['GET', 'POST'])
def forgot():
form = ResetLoginForm(request.form)
#There's no session yet. User just pointing to /login/forgot url.
if request.method == 'POST' and form.validate():
user = User.query.filter_by(email=form.email.data).first()
if not user:
flash('The username or email incorrect')
return render_template('forgot.html', form=form)
reset_key = generate_key() ## this creates a new key, but how update this key into db?
#tried something like
user.reset_key = reset_key
db.session.add(user)
db.session.commit()
#this is not working. Is it due to session is not started or something?
Run Code Online (Sandbox Code Playgroud)
感谢您的任何帮助或提示。
我有一个现有的使用 SQLAlchemy 的 Flask 应用程序。这个应用程序中的几个模型/表都有存储原始 HTML 的列,我想在列的 setter 上注入一个函数,以便传入的原始 html 被“清理”。我想在模型中执行此操作,因此我不必在整个表单或路由代码中添加“清理此数据”。
我目前已经可以这样做:
from application import db, clean_the_data
from sqlalchemy.ext.hybrid import hybrid_property
class Example(db.Model):
__tablename__ = 'example'
normal_column = db.Column(db.Integer,
primary_key=True,
autoincrement=True)
_html_column = db.Column('html_column', db.Text,
nullable=False)
@hybrid_property
def html_column(self):
return self._html_column
@html_column.setter
def html_column(self, value):
self._html_column = clean_the_data(value)
Run Code Online (Sandbox Code Playgroud)
这就像一个魅力 - 除了模型定义之外,_html_column 名称从未出现过,调用了更清洁的函数,并使用了清洁后的数据。万岁。
我当然可以停在那里,只吃列的丑陋处理,但是当您可以弄乱元类时为什么要这样做呢?
注意:以下都假设“application”是主要的 Flask 模块,并且它包含两个子项:“db”——SQLAlchemy 句柄和“clean_the_data”——清理传入 HTML 的函数。
因此,我开始尝试创建一个新的基本 Model 类,该类在创建类时发现需要清理的列,并自动处理各种事情,因此您可以执行以下操作,而不是上面的代码:
from application import db
class Example(db.Model):
__tablename__ = 'example'
__html_columns__ = ['html_column'] # Our oh-so-subtle hint
normal_column …Run Code Online (Sandbox Code Playgroud) 我正在使用SqlAlchemy在Flask 中构建一个与运动相关的应用程序。我有一个游戏表,它有一个和 ,它们都加入了团队表。home_teamaway_team
我希望能够声明Team表和Game表之间的关系,但我收到一条错误消息
Could not determine join condition between parent/child tables on relationship Team.games - there are multiple foreign key paths linking the tables. Specify the 'foreign_keys' argument, providing a list of those columns which should be counted as containing a foreign key reference to the parent table.
模型声明如下所示:
class Team(db.Model):
"""Team model."""
__tablename__ = "teams"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String)
monkier = …Run Code Online (Sandbox Code Playgroud) 我都试过了
from flask.ext.sqlalchemy import SQLAlchemy
Run Code Online (Sandbox Code Playgroud)
和
from flask_sqlalchemy import SQLAlchemy
Run Code Online (Sandbox Code Playgroud)
内部烧瓶/ ESK我只有一个__init__.py和__init__.pyc,并且内部flask_sqlalchemy我只有_compat.py,_coompat.pyc,__init__.py和__init__.pyc。我应该将 SQLAlchemy 包复制到这些目录之一吗?我在这里读到 ext 已弃用,所以我不确定。
我收到这些错误
ImportError: No module named flask_sqlalchemy
Run Code Online (Sandbox Code Playgroud)
和
ImportError: No module named flask.ext.sqlalchemy
Run Code Online (Sandbox Code Playgroud)
我用pip安装
这是 PostgreSQL 中一个非常简单的示例:
WITH a AS (
SELECT 1 AS x
), b AS (
SELECT x AS y
FROM a
)
SELECT y
FROM b;
Run Code Online (Sandbox Code Playgroud)
我怎样才能让 SQLAlchemy 生成它(最好使用声明式)?
以下代码将 postgres BYTEA 列流式传输到浏览器
from flask import Response, stream_with_context
@app.route('/api/1/zfile/<file_id>', methods=['GET'])
def download_file(file_id):
file = ZFile.query.filter_by(id=file_id).first()
return Response(stream_with_context(file.data), mimetype=file.mime_type)
Run Code Online (Sandbox Code Playgroud)
它非常慢(5 mb 大约需要 6 分钟)。
我正在从同一台主机上使用 curl 下载,所以网络不是问题,而且我可以在不到一秒钟的时间内从 psql 控制台提取文件,所以似乎数据库端也不应该受到指责:
COPY (select f.data from z_file f where f.id = '4ec3rf') TO 'zazX.pdf' (FORMAT binary)
Run Code Online (Sandbox Code Playgroud)
我有进一步的证据表明“从数据库中获取”步骤并不慢,如果我使用 file.data 将 file.data 写入文件
with open("/vagrant/zoz.pdf", 'wb') as output:
output.write(file.data)
Run Code Online (Sandbox Code Playgroud)
它也需要几分之一秒。所以缓慢是由 Flask 进行流式传输的方式引起的。
我有一个 MySQL 数据库,下面是定义的两个模型。
class Agent(db.Model):
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(255), nullable=False, unique=True)
premium_date = db.Column(db.DateTime, nullable=True)
class Property(db.Model):
id = db.Column(db.Integer, primary_key=True)
agent_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
agent = db.relationship('Agent')
title = db.Column(db.String(255), nullable=False)
Run Code Online (Sandbox Code Playgroud)
我使用以下查询获取所有属性:
properties = models.Property.query.all()
和使用以下查询的 premium_date 代理:
agents = models.Agent.query.filter(models.Agent.premium_date is not None).all()
但我想先显示拥有 premium(agent.premium_date) 的代理发布的属性,然后显示其余属性。(这就像优先考虑高级代理)。
注意:由于 premium_date 是可选的,一些代理不会是高级用户,因此该列将为空。
无论如何在 Flask-SQLAlchemy 中这样做?任何帮助都会很棒。
尝试在 OpenShift 上部署我的应用程序时遇到此错误:
Traceback (most recent call last):
File "app.py", line 35, in <module>
application = imp.load_source('app', 'flaskapp.py')
File "flaskapp.py", line 2, in <module>
from flask_sqlalchemy import SQLAlchemy
File "/var/lib/openshift/56ad93df7628e163fa00003a/python/virtenv/lib/python2.7/site-packages/
Flask_SQLAlchemy-2.1-py2.7.egg/flask_sqlalchemy/__init__.py", line 25, in <module>
from sqlalchemy import orm, event, inspect
ImportError: cannot import name inspect
Run Code Online (Sandbox Code Playgroud)
搜索答案我了解到原因是我的 Python 环境在某种程度上损坏了,但我不知道如何修复 OpenShift 环境。我该怎么办?
flask-sqlalchemy ×10
flask ×9
python ×7
sqlalchemy ×6
metaclass ×1
openshift ×1
postgresql ×1
python-3.x ×1
sqlite ×1