标签: flask-sqlalchemy

Flask Postgresql 数组不会永久更新

我正在使用 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)

python sqlalchemy flask flask-sqlalchemy

3
推荐指数
1
解决办法
3386
查看次数

创建flask-SQLAlchemy BaseQuery 对象的两种方法-只有一种有效,为什么?

这个问题是“在 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)

python sqlalchemy flask flask-sqlalchemy

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

python-flask db.session.commit() 不工作

问题是当用户尝试“忘记密码”选项时。它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)

感谢您的任何帮助或提示。

python flask flask-sqlalchemy

3
推荐指数
1
解决办法
7366
查看次数

Flask + SQLAlchemy - 自定义元类来修改列设置器(动态混合属性)

我有一个现有的使用 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)

python sqlalchemy metaclass flask flask-sqlalchemy

3
推荐指数
1
解决办法
1230
查看次数

两列使用 SqlAlchemy 加入同一个表

我正在使用SqlAlchemyFlask 中构建一个与运动相关的应用程序。我有一个游戏表,它有一个和 ,它们都加入了团队表。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)

sqlite flask python-3.x flask-sqlalchemy

3
推荐指数
1
解决办法
1337
查看次数

Flask-SQL 中没有 SQLAlchemy 模块

我都试过了

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安装

python sqlalchemy flask flask-sqlalchemy

3
推荐指数
1
解决办法
5426
查看次数

SQLAlchemy 中的依赖 CTE?(里面的例子)

这是 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 生成它(最好使用声明式)?

python postgresql sqlalchemy flask-sqlalchemy

3
推荐指数
1
解决办法
1652
查看次数

Flask:使用 stream_with_context 流式传输文件非常慢

以下代码将 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 进行流式传输的方式引起的。

flask flask-sqlalchemy

3
推荐指数
1
解决办法
2513
查看次数

在 Flask-sqlalchemy 中获取排序结果

我有一个 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 中这样做?任何帮助都会很棒。

sqlalchemy flask flask-sqlalchemy

3
推荐指数
1
解决办法
3602
查看次数

导入错误:无法导入名称检查 OpenShift

尝试在 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 环境。我该怎么办?

python flask flask-sqlalchemy openshift

3
推荐指数
1
解决办法
1901
查看次数