标签: flask-sqlalchemy

如何在Flask-SQLAlchemy中为db.session加入查询进行分页?

说,我们有以下关系:

  • 一个人可以拥有许多电子邮件地址
  • 电子邮件服务提供商可以(显然)提供多个电子邮件地址

所以,这是一个多对多的关系.我有三个表:电子邮件,提供商和用户.电子邮件有两个外国ID供提供者和用户使用.

现在,给定一个特定的人,我想打印所有电子邮件提供商及其为此人托管的电子邮件地址(如果存在).(如果此人没有Gmail上的电子邮件,我仍然希望Gmail出现在结果中.我相信否则我只需要一个左内联接即可解决此问题.)

我想出了如何使用以下子查询执行此操作(遵循sqlalchemy教程):

email_subq = db.session.query(Emails).\
                filter(Emails.user_id==current_user.id).\
                subquery()

provider_and_email = db.session.query(Provider, email_subq).\
                outerjoin(email_subq, Provider.emails).\
                all()
Run Code Online (Sandbox Code Playgroud)

这工作正常(它返回一个4元组(Provider, user_id, provider_id, email_address),我想要的所有信息),但我后来发现这不是使用Flask BaseQuery类,因此paginationFlask-SQLAlchemy提供的功能不起作用.显然db.session.query()不是Flask-SQLAlchemy Query实例.

我试图这样做,Emails.query.outerjoin[...]但只返回电子邮件表中的列,虽然我想要提供商信息和电子邮件.

我的问题:如何使用Flask-SQLAlchemy做同样的事情,这样我就不必重新实现已经存在的分页?


我想在这一点上最简单的选择是实现我自己的paginate函数,但是我想知道是否有另一种正确的方法可以做到这一点.

python sqlalchemy flask flask-sqlalchemy

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

从SQLalchemy和Flask中的相关列表中查询

我有User哪个has-one Person.所以User.person是一个Person.
我想User从列表中获取一个列表Person.

我尝试了以下方法:

>>> people = Person.query.filter().limit(3)
<flask_sqlalchemy.BaseQuery object at 0x111c69bd0>

>>> User.query.filter(User.person.in_(people)).all()
NotImplementedError: in_() not yet supported for relationships.  For a simple many-to-one, use in_() against the set of foreign key values.
Run Code Online (Sandbox Code Playgroud)

获取该列表中的Users 列表的最佳方法User.personpeople什么?

python sqlalchemy flask flask-sqlalchemy

8
推荐指数
1
解决办法
2144
查看次数

将"外部"类模型与flask sqlalchemy相关联

我们为各种python模块使用中央类模型.此模型使用SQLAlchemy定义.这些类都继承自declarative_base.

例如,我们的模型定义如下所示:

Base = declarative_base()

class Post(Base):
    __tablename__ = 'Posts'
    id = Column(INT, primary_key=True, autoincrement=True)
    body = Column(TEXT)
    timestamp = Column(TIMESTAMP)
    user_id = Column(INT, ForeignKey('Users.uid'))
Run Code Online (Sandbox Code Playgroud)

我们一直在构建一个烧瓶网络应用程序,我们在其中使用相同的模型.我们发现了一个棘手的问题,因为flask-sqlalchemy似乎是以这样的方式设计的,它希望通过传入会话的活动实例来定义其模型中使用的所有类.以下是"适当的"flask-sqalchemy类模型定义的示例:

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)


class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(120), unique=True)
Run Code Online (Sandbox Code Playgroud)

请注意,flask-sqlalchemy的上述示例需要已经实例化的sql会话.这让我们感到震惊,因为我们完全不知道如何将我们的SqlAlchemy模型集成到烧瓶中.我们真的想特别使用flask-security套件.

这个问题在SO之前提出过.这里,例如: 如何使用现有sqlalchemy模型的flask-sqlalchemy?

我们的要求与那些接受回复的人的要求不同.响应指出一个人失去了使用User.query的能力,但这正是我们必须保留的事情之一.

放弃我们漂亮,优雅,中心阶级的模型定义,而不是使用flask-sqlalchemy所需要的东西是不可行的.我们有什么方法可以将我们的模型与SQLAlchemy()对象相关联吗?在我们的类上获取.query()方法的加分点似乎是flask-security所需要的.

python sqlalchemy flask flask-sqlalchemy flask-security

8
推荐指数
1
解决办法
2167
查看次数

Flask-sqlalchemy 查询日期时间间隔

我用flask-sqlalchemy 定义了一个表。显示如下。

class Notes(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    notes = db.Column(db.Text, nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
    added_at = db.Column(db.DateTime, default=db.func.now())

@staticmethod
def newest(num):
    return Notes.query.order_by(desc(Notes.added_at)).limit(num)
Run Code Online (Sandbox Code Playgroud)

我正在尝试编写一个查询来替换和已经存在的直接查询,它看起来像这样。

select notes,user,added_at from notes where added_at >= now() - INTERVAL 8 HOUR;
Run Code Online (Sandbox Code Playgroud)

但是,根据我可以找到的文档,我无法找到执行相同操作的方法。我能够进行更简单的查询,但我正在努力重新创建 sql 本身中非常简单的内容。

我非常愿意阅读一些围绕它的文档,但也无法准确地确定下来。你能提供的任何方向都会很棒。

python flask-sqlalchemy

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

Flask-SQLAlchemy create_all如何发现要创建的模型?

Flask-SQLAlchemy的db.create_all()方法创建与我定义的模型相对应的每个表.我从不实例化或注册模型的实例.它们只是继承自的类定义db.Model.它如何知道我定义了哪些型号?

python sqlalchemy flask flask-sqlalchemy

8
推荐指数
1
解决办法
3089
查看次数

sqlalchemy.orm.exc.StaleDataError:表“library_category_items”上的 DELETE 语句预期删除 1 行;只有 2 个匹配

我有两张桌子。一种称为书籍,一种称为 library_categories。现在我想将书籍排序到 library_categories 中,条件是一本书可以属于多个图书馆类别。这是我的书

class Books(db.Model):

    book_id = db.Column(db.String(1000), primary_key=True)
    price = db.Column(db.String(1000))

    def __repr__(self):
        return '<Books %r>' % (self.arxiv_id)
Run Code Online (Sandbox Code Playgroud)

这是我的图书馆类别

class Library_category(db.Model):

    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    name = db.Column(db.String(1000))

def __repr__(self):
    return '<Library_category %r>' % (self.id)
Run Code Online (Sandbox Code Playgroud)

任何用户都可以在其中创建类别。现在我想链接图书馆类别和书籍,我通过一个表格来做到这一点

library_category_items = db.Table('library_category_items',
    db.Column('books_book_id', db.String(1000), db.ForeignKey('books.book_id')),
    db.Column('library_category_id', db.Integer, db.ForeignKey('library_category.id'))
)
Run Code Online (Sandbox Code Playgroud)

这一切似乎都很好,但是当我想从这个表中删除一本书时,我得到了两个类别

sqlalchemy.orm.exc.StaleDataError: DELETE statement on table 'library_category_items' expected to delete 1 row(s); Only 2 were matched.
Run Code Online (Sandbox Code Playgroud)

删除是这样完成的

users = models.User.query.all()
for user in users:
    for category in user.library_categories.all(): …
Run Code Online (Sandbox Code Playgroud)

sql sqlalchemy flask-sqlalchemy

8
推荐指数
1
解决办法
2844
查看次数

如何在SQLAlchemy中使用文本数组列创建GIN索引(使用PostgreSQL和python)

我想在postgre表上执行大量的查询以按标签过滤

from sqlalchemy.dialects.postgresql import ARRAY

class Post(db.Model):
    __tablename__ = 'post'

    id = db.Column(db.Integer, primary_key=True)
    tags = db.Column(ARRAY(db.String))
Run Code Online (Sandbox Code Playgroud)

此链接建议将标记存储为具有GIN索引的文本数组.

如何将GIN索引添加到上表?我是否使用Stringvs Text数据类型也有所不同?

python postgresql indexing sqlalchemy flask-sqlalchemy

8
推荐指数
1
解决办法
2030
查看次数

SQLALCHEMY:如何在flask_sqlalchemy-SQLalchemy 中使用@events.listens_for

我需要一些帮助来自动化 sqlalchemy 中的一些任务。当新用户在我的网站上注册时,我需要添加 5 名人员。

我想使用 sqlalchemy,events因为如果我可以让它工作,它将在以后派上用场用于其他自动化。

我正在关注 Miguel Grinberg 先生关于如何制作烧瓶应用程序和定义我的模型(db.Model not Base)的教程。

我读到要使用@event.listens_for(User.__table__, "after_insert")我必须使用声明性基础。有没有解决的办法?我的模型结构涉及近 15 个表!

  class User(db.Model):
        __tablename__ = "user"
        id = db.Column(db.Integer, primary_key=True, autoincrement=True)
        email = db.Column(db.String(64), unique=True, index=True)
        username = db.Column(db.String(64), unique=True, index=True)
        password_hash = db.Column(db.String(128))
        store = db.relationship('Store', uselist=False, backref="user")



@event.listens_for(User.__table__, "after_insert")
def add_personnel(*args, **kwargs):
    for i in range(5):
        db.session.add(Personnel,store_id = User.query.last().id)
    db.session.commit()
    return None

class Personnel(db.Model):
    __tablename__ = "personnel"
    id = db.Column(db.Integer, primary_key=True)
    store_id = db.Column(db.Integer, db.ForeignKey('store.id'))
    first_name …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy flask-sqlalchemy

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

如何避免在 Flask 应用程序中使用 Flask SQLAlchemy 模型进行循环导入?

我正在使用 Flask 并构建一个使用 Flask SQLAlchemy 的应用程序。我创建了一个基本的 API,当所有代码都在一个文件中时,它可以工作,但希望更好地组织它,如下所示:

应用程序/模型/user.py

from datetime import datetime
from app.app import db


class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    public_id = db.Column(db.String, unique=True)
    admin = db.Column(db.Boolean)
    username = db.Column(db.String(50), unique=True)
    email = db.Column(db.String(50), unique=True)
    password = db.Column(db.String(100))
    subscription_plan = db.Column(db.Integer)
    created_at = db.Column(db.DateTime, index=True,
                           default=datetime.utcnow())
    updated_at = db.Column(db.DateTime, index=True, default=datetime.utcnow())
Run Code Online (Sandbox Code Playgroud)

应用程序/应用程序.py

from flask import Flask, request, jsonify
from flask_sqlalchemy import SQLAlchemy
from werkzeug.security import generate_password_hash
import uuid

from app.models.user import User

app = Flask(__name__)

app.config['SQLALCHEMY_DATABASE_URI'] = #SQLALCHEMY_DATABASE_URI …
Run Code Online (Sandbox Code Playgroud)

python flask flask-sqlalchemy

8
推荐指数
1
解决办法
4899
查看次数

Sqlalchemy 查询返回 Decimal 对象

我有以下模型:

  172  class ReportRecord(db.Model):                                                                                                                                                                                
  173     __tablename__ = 'tb_report_record'                                                                                                                                                                         174                                                                                                                                                                                                                175     id = db.Column(Integer, primary_key=True)                                                                                                                                                                
  176     report_id = db.Column(ForeignKey('tb_rua_report.id'), index=True)                                                                                                                                        
  177     source_ip = db.Column(String(100, 'utf8_bin'))                                                                                                                                                           
  178     count = db.Column(Integer)                                                                                                                                                                               
  179     disposition = db.Column(String(10, 'utf8_bin'))                                                                                                                                                          
  180     header_from = db.Column(String(100, 'utf8_bin'))                                                                                                                                                         
  181     spf_domain = db.Column(String(100, 'utf8_bin'))                                                                                                                                                          
  182     spf_result = db.Column(String(10, 'utf8_bin'))                                                                                                                                                           
  183     dkim_domain = db.Column(String(100, 'utf8_bin'))                                                                                                                                                         
  184     dkim_result = db.Column(String(10, 'utf8_bin'))                                                                                                                                                          
  185     isActive = db.Column(Integer, nullable=False, server_default=text("'1'"))                                                                                                                                  186     created_by = db.Column(String(100), nullable=False, server_default=text("'System'"))                                                                                                                     
  187     created_dt = db.Column(DateTime, nullable=False)                                                                                                                                                         
  188     last_modified_by = db.Column(String(100), nullable=False, …
Run Code Online (Sandbox Code Playgroud)

casting sqlalchemy sqldatatypes flask-sqlalchemy

8
推荐指数
2
解决办法
3915
查看次数