标签: flask-sqlalchemy

SQLAlchemy查询,按关系加入关系和顺序

我有两个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命令?

谢谢!

python sqlalchemy flask flask-sqlalchemy

10
推荐指数
1
解决办法
6666
查看次数

Alembic不会在自动生成中添加Cascade信息?

这是我的Budget架构

class Budget(db.Model):
    __tablename__ = 'budgets'
    # noinspection PyRedeclaration
    uuid = Column('uuid', GUID(), default=uuid.uuid4, primary_key=True,
                  unique=True)
    user_id = Column(GUID(), ForeignKey('users.uuid'), nullable=False)
    user = relationship('User', backref='budgets')
    created_on = Column('created_on', sa.types.DateTime(timezone=True),
                        nullable=False)
Run Code Online (Sandbox Code Playgroud)

BudgetCategories

class BudgetCategory(db.Model):
    __tablename__ = 'budget_categories'
    # noinspection PyRedeclaration
    uuid = Column('uuid', GUID(), default=uuid.uuid4, primary_key=True,
                  unique=True)
    budget_id = Column(GUID(), ForeignKey('budgets.uuid'), nullable=False)
    budget = relationship('Budget', backref='budgetCategories',
                          cascade="all, delete-orphan", single_parent=True)
    category = Column('category', sa.types.String, nullable=True)
    parent_category = Column('parent_category', sa.types.String, nullable=True)
    amount = Column('amount', Numeric(10, 2), nullable=False)
    recurring = Column('recurring', …
Run Code Online (Sandbox Code Playgroud)

python orm sqlalchemy flask-sqlalchemy alembic

10
推荐指数
1
解决办法
4149
查看次数

如何通过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给列?

python sqlalchemy flask flask-sqlalchemy alembic

10
推荐指数
1
解决办法
8767
查看次数

在Flask-SQLAlchemy中隔离py.test数据库会话

我正在尝试使用Flask-SQLAlchemy构建Flask应用程序; 我使用pytest来测试数据库.其中一个问题似乎是在不同测试之间创建隔离的数据库会话.

我做了一个最小的,完整的例子来突出问题,请注意test_user_schema1()并且test_user_schema2()是相同的.

文件名: test_db.py

from models import User

def test_user_schema1(session):
    person_name = 'Fran Clan'
    uu = User(name=person_name)
    session.add(uu)
    session.commit()

    assert uu.id==1
    assert uu.name==person_name

def test_user_schema2(session):
    person_name = 'Stan Clan'
    uu = User(name=person_name)
    session.add(uu)
    session.commit()

    assert uu.id==1
    assert uu.name==person_name
Run Code Online (Sandbox Code Playgroud)

如果db在我的测试之间真正隔离,那么两个测试都应该通过.但是,最后一次测试总是失败,因为我还没有找到使数据库会话正确回滚的方法.

sqlalchemy_session_fail

conftest.py根据我在Alex Michael的博客文章中看到的内容使用以下内容,但是这个夹具代码中断了,因为它显然没有隔离夹具之间的db会话.

@pytest.yield_fixture(scope='function')
def session(app, db):
    connection = db.engine.connect()
    transaction = connection.begin()

    #options = dict(bind=connection, binds={})
    options = dict(bind=connection)
    session = db.create_scoped_session(options=options)

    yield session

    # Finalize test here
    transaction.rollback()
    connection.close()
    session.remove()
Run Code Online (Sandbox Code Playgroud)

出于这个问题的目的,我构建了一个要点 …

python unit-testing pytest flask flask-sqlalchemy

10
推荐指数
2
解决办法
4440
查看次数

SQLAlchemy查询是否容易受到注入攻击?

我有以下like用于搜索博客的查询.如果我这样做,我不确定自己是否容易受到SQL注入攻击.SQLAlchemy如何处理这个问题?安全吗?

search_results = Blog.query.with_entities(Blog.blog_title).filter(Blog.blog_title.like("%"+ searchQuery['queryText'] +"%")).all()
Run Code Online (Sandbox Code Playgroud)

python security sql-injection flask flask-sqlalchemy

10
推荐指数
1
解决办法
4156
查看次数

flask-sqlalchemy:AttributeError:type object没有属性'query',在ipython中工作

我正在创建一个新的烧瓶应用程序使用flask-sqlalchemy和flask-restful with Python 3.4.我已经定义了我的用户模型:

from mytvpy import db
from sqlalchemy.ext.declarative import declared_attr


class BaseModel(db.Model):
    __abstract__ = True

    id = db.Column(db.Integer, primary_key=True)
    created = db.Column(db.TIMESTAMP, server_default=db.func.now())
    last_updated = db.Column(db.TIMESTAMP, server_default=db.func.now(), onupdate=db.func.current_timestamp())

    @declared_attr
    def __tablename__(cls):
        return cls.__name__


class User(BaseModel):

    username = db.Column(db.String(255), unique=True)
    password = db.Column(db.String(255))
    email = db.Column(db.String(255), unique=True)

    def __init__(self, username, password, email):
        super(User, self).__init__()
        self.username = username
        self.password = password
        self.email = email
Run Code Online (Sandbox Code Playgroud)

如果我尝试在ipython中查询,它可以工作:

In [15]: from mytvpy.models.base import User

In [16]: User.query.all()
Out[16]: [<mytvpy.models.base.User at 0x7fac65b1c6a0>]
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试从端点点击它:

class …
Run Code Online (Sandbox Code Playgroud)

python flask flask-sqlalchemy flask-restful

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

flask-admin形式:根据字段1的值限制字段2的值

我一直努力在flask-admin中实现的一个功能是当用户编辑表单时,一旦设置了字段1就限制字段2的值.

让我用文字举一个简化的例子(实际的用例更复杂).然后我将展示实现该示例的完整要点,减去"约束"功能.

假设我们有一个数据库,可以跟踪一些软件"配方",以各种格式输出报告.在recipe我们的样本数据库的表中有两个配方:"严重的报告","ASCII艺术".

为了实现每个配方,我们从几种方法中选择一种.method我们数据库的表有两个方法:"tabulate_results","pretty_print".

每种方法都有参数.该methodarg表有两个参数名称"tabulate_results"("rows","display_total")和两个参数"pretty_print"("embellishment_character","lines_to_jump").

现在,对于每个配方("严肃报告","ASCII艺术"),我们需要提供各自方法的参数值("tabulate_results","pretty_print").

对于每个记录,该recipearg表允许我们选择一个配方(即字段1,例如"严重报告")和参数名称(即字段2).问题是显示了所有可能的参数名称,而它们需要根据字段1的值进行约束.

我们可以实现哪些过滤/约束机制,一旦我们选择"严重报告",我们知道我们将使用"tabulate_results"方法,因此只有"rows"和"display_total"参数可用?

我正在考虑一些AJAX巫术,它检查Field 1并为Field 2值设置查询,但不知道如何继续.

您可以通过使用要点来看到这一点:单击Recipe Arg选项卡.在第一行("严重报告")中,如果您尝试通过单击来编辑"Methodarg"值,则所有四个参数名称都可用,而不是仅两个.

# full gist: please run this

from flask import Flask
from flask_admin import Admin
from flask_admin.contrib import sqla
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import Column, ForeignKey, Integer, String
from sqlalchemy.orm import relationship

# Create application
app = Flask(__name__)

# Create dummy secrey key so we can use sessions
app.config['SECRET_KEY'] = '123456790'

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///a_sample_database.sqlite'
app.config['SQLALCHEMY_ECHO'] = …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy flask flask-sqlalchemy flask-admin

10
推荐指数
1
解决办法
2050
查看次数

sqlalchemy的Flask应用程序上下文

我正在研究烧瓶中的小休息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)

python flask flask-sqlalchemy flask-restful

10
推荐指数
1
解决办法
4477
查看次数

我可以检查sqlalchemy查询对象以查找已连接的表吗?

我正在尝试以编程方式构建搜索查询,为此,我正在加入一个表.

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已经加入了,那就太酷了,如果是的话就跳过它.我有一些更复杂的查询构建,真正从中受益.

如果对于我错过的搜索构建查询的策略完全不同,那也会很棒.或者,如果上面的代码没问题,如果我两次加入表格,这也是很好的信息.任何帮助都非常感激!!!

python join sqlalchemy flask-sqlalchemy

10
推荐指数
3
解决办法
1963
查看次数

Pycharm SqlAlchemy自动完成无法正常工作

我正在使用SQLAlchemy和Pycharm,但PyCharm无法看到SQLAlchemy的方法用于自动完成功能.

码:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///data.sqlite3'
db = SQLAlchemy(app)


class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(16), index=True, unique=True)

if __name__ == '__main__':
    db.create_all()
    app.run(debug=True)
Run Code Online (Sandbox Code Playgroud)

例如,如果我想调用User类的SQLAlchemy方法,我必须手动输入完整的方法名称User.query.filter_by(username ='peter').first() 自动完成示例

如何为SQLAlchemy进行自动完成工作?

1)是的,项目被多次重新加载
2)是的,文件中的右侧翻译| 设置| 项目
3)是的,PyCharm没有处于省电模式
4)是的,我有专业版.

python sqlalchemy autocomplete pycharm flask-sqlalchemy

10
推荐指数
2
解决办法
2056
查看次数