说,我们有以下关系:
所以,这是一个多对多的关系.我有三个表:电子邮件,提供商和用户.电子邮件有两个外国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函数,但是我想知道是否有另一种正确的方法可以做到这一点.
我有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.person是people什么?
我们为各种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所需要的.
我用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 本身中非常简单的内容。
我非常愿意阅读一些围绕它的文档,但也无法准确地确定下来。你能提供的任何方向都会很棒。
Flask-SQLAlchemy的db.create_all()方法创建与我定义的模型相对应的每个表.我从不实例化或注册模型的实例.它们只是继承自的类定义db.Model.它如何知道我定义了哪些型号?
我有两张桌子。一种称为书籍,一种称为 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) 我想在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数据类型也有所不同?
我需要一些帮助来自动化 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) 我正在使用 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) 我有以下模型:
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) flask-sqlalchemy ×10
python ×8
sqlalchemy ×8
flask ×5
casting ×1
indexing ×1
postgresql ×1
sql ×1
sqldatatypes ×1