标签: flask-sqlalchemy

SQLAlchemy按照多对多的关系排序

这是我当前模型的简化示例(我正在使用Flask SQLAlchemy扩展):

like = db.Table(
    'like',
    db.Column('uid', db.Integer, db.ForeignKey('users.id')),
    db.Column('pid', db.Integer, db.ForeignKey('posts.id'))
)

class User(db.Model):
    __tablename__ = 'users'

    id = db.Column(db.Integer, primary_key = True)
    username = db.Column(db.String(20))

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

    id = db.Column(db.Integer, primary_key = True)
    title = db.Column(db.String(255))

    likes = db.relationship(
        'User',
        secondary = like,
        backref = db.backref('likes', lazy = 'dynamic'),
        lazy = 'dynamic'
    )
Run Code Online (Sandbox Code Playgroud)

我试图Post通过喜欢的数量订购.

这是我基本上试图发出的查询:

SELECT p.*, COUNT(l.`pid`) as `likes`
FROM `posts` as p
LEFT JOIN `like` …
Run Code Online (Sandbox Code Playgroud)

python orm sqlalchemy flask flask-sqlalchemy

26
推荐指数
1
解决办法
9621
查看次数

在Flask-sqlalchemy和Postgresql中使用JSON Type

背景: 我正在构建一个Flask应用程序,我已将数据存储到postgresql数据库和JSON列类型中.

任务: 在我的视图函数中,我想从JSON列的{Key:Value}订购数据库查询

完成:我已成功通过使用以下命令在psql命令行执行此查询,例如:

select*from target where cast(product - >>'profit'as float)> 100 order by cast(product - >>'salesrank'as integer)asc;

问题:我无法在我的代码中复制此查询(请参阅下面的额外信息部分中的模型代码)

from app import app, db
from models import Target 

data = Target.query.order_by(Target.product['salesrank'])
Run Code Online (Sandbox Code Playgroud)

收到错误 - ProgrammingError:(ProgrammingError)无法识别类型json的排序运算符LINE 2:FROM target ORDER BY target.product - >'salesrank'^ HINT:使用显式排序运算符或修改查询.'SELECT target.id AS target_id,target.store AS target_store,target.product AS target_product,target.asin AS target_asin,target.date AS target_date \nFROM target ORDER BY target.product - >%(product_1)s \n LIMIT% (param_1)s'{'product_1':'salesrank','param_1':1}

额外信息 我的目标模型设置如下:

#models.py
from app import db
from sqlalchemy.dialects.postgresql import JSON
import datetime …
Run Code Online (Sandbox Code Playgroud)

python postgresql json flask flask-sqlalchemy

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

Flask-SQLAlchemy检查表中是否存在行

我有一个Flask应用程序,它使用Flask-SQLAlchemy连接到MySQL数据库.

我希望能够检查表中是否存在行.我如何修改这样的查询以检查行是否存在:

db.session.query(User).filter_by(name='John Smith')
Run Code Online (Sandbox Code Playgroud)

我找到了一个使用SQLAlchemy的问题的解决方案,但似乎不符合Flask-SQLAlchemy的工作方式:

from sqlalchemy.sql import exists    
print session.query(exists().where(User.email == '...')).scalar()
Run Code Online (Sandbox Code Playgroud)

谢谢.

python sqlalchemy flask flask-sqlalchemy

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

SQLAlchemy delete不会级联

我的User模型与模型有关系Address.我已经指定关系应该级联删除操作.但是,当我查询并删除用户时,我收到一个错误,即仍然引用了地址行.如何删除用户和地址?

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    addresses = db.relationship('Address', cascade='all,delete', backref='user')

class Address(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey(User.id))
Run Code Online (Sandbox Code Playgroud)
db.session.query(User).filter(User.my_id==1).delete()
Run Code Online (Sandbox Code Playgroud)
IntegrityError: (IntegrityError) update or delete on table "user" violates foreign key constraint "addresses_user_id_fkey" on table "address"
DETAIL:  Key (my_id)=(1) is still referenced from table "address".
 'DELETE FROM "user" WHERE "user".id = %(id_1)s' {'id_1': 1}
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy flask flask-sqlalchemy

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

sqlalchemy postgresql枚举不会在db migrate上创建类型

我在Python3下使用Flask开发了一个web应用程序.我在db migrate/upgrade上遇到postgresql枚举类型的问题.

我在模型中添加了一个"状态"列:

class Banner(db.Model):
    ...
    status = db.Column(db.Enum('active', 'inactive', 'archive', name='banner_status'))
    ...
Run Code Online (Sandbox Code Playgroud)

生成的迁移python manage.py db migrate是:

from alembic import op
import sqlalchemy as sa

def upgrade():
    op.add_column('banner', sa.Column('status', sa.Enum('active', 'inactive', 'archive', name='banner_status'), nullable=True))

def downgrade():
    op.drop_column('banner', 'status')
Run Code Online (Sandbox Code Playgroud)

当我这样做时,python manage.py db upgrade我得到一个错误:

...
sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) type "banner_status" does not exist
LINE 1: ALTER TABLE banner ADD COLUMN status banner_status

 [SQL: 'ALTER TABLE banner ADD COLUMN status banner_status']
Run Code Online (Sandbox Code Playgroud)

为什么迁移不会创建类型"banner_status"?

我究竟做错了什么?

$ pip freeze
alembic==0.8.6
Flask==0.10.1
Flask-Fixtures==0.3.3
Flask-Login==0.3.2 …
Run Code Online (Sandbox Code Playgroud)

sqlalchemy sqlalchemy-migrate flask flask-sqlalchemy flask-migrate

25
推荐指数
1
解决办法
7065
查看次数

Alembic:如何向现有列添加唯一约束

我有一个表'test',其列'Name'没有约束.ALTER通过给它一个UNIQUE约束我需要这个专栏.我该怎么办?

我应该使用op.alter_column('???')create_unique_constraint('???')?新列不是create_unique_constraint而不是现有列吗?

sqlalchemy flask-sqlalchemy alembic

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

Flask-SQLAlchemy构造函数

在Flask-SQLAlchemy教程中,定义了User模型的构造函数:

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy

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)

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

对于有两列的表,这可能是可以接受的,但如果我有10列以上的表怎么办?每次定义新模型时必须定义构造函数吗?

python sqlalchemy flask flask-sqlalchemy

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

在提交会话之前获取插入密钥

class Parent(db.Model):
    id = db.Column(db.Integer, primary_key=True)

class Child(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    parent_id = db.Column(db.Integer, db.ForeignKey('parent.id'))

parent = Parent()
db.session.add(parent)

child = Child()
child.parent_id = parent.id
db.session.add(child)

db.session.commit()
Run Code Online (Sandbox Code Playgroud)

我想INSERT到两个parentchild表考虑到一个会话中parent_id必须包含在该child表中.在我创建child对象的那一刻,parent.idNone.

我怎样才能做到这一点?

python sqlalchemy flask flask-sqlalchemy

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

flask_uploads:导入错误:无法导入名称“secure_filename”

我想创建一个表单,允许使用烧瓶表单发送带有描述的图片。我尝试使用此视频:https : //www.youtube.com/watch?v=Exf8RbgKmhM

但是我在启动 app.py 时遇到了麻烦:

?  website git:(master) ? python3.6 app.py
Traceback (most recent call last):
  File "app.py", line 10, in <module>
    from flask.ext.uploads import UploadSet, configure_uploads, IMAGES
ModuleNotFoundError: No module named 'flask.ext'
Run Code Online (Sandbox Code Playgroud)

我不得不替换为 flask.ext.uploadsflask_uploads 但现在我得到:

Traceback (most recent call last):
  File "app.py", line 10, in <module>
    from flask_uploads import UploadSet, configure_uploads, IMAGES
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/flask_uploads.py", line 26, in <module>
    from werkzeug import secure_filename, FileStorage
ImportError: cannot import name 'secure_filename'
Run Code Online (Sandbox Code Playgroud)

我的导入和配置如下所示:

from datetime import datetime
from flask_sqlalchemy …
Run Code Online (Sandbox Code Playgroud)

python flask flask-sqlalchemy flask-uploads python-3.6

24
推荐指数
4
解决办法
4万
查看次数

Alembic:alembic修订版称导入错误

我正在尝试将我的Flask项目与Alembic
我的应用程序结构集成

project/
       configuration/
                    __init__.py
                    dev.py
                    test.py
       core/
           # all source code
       db/
         migrations/
                    __init__.py
                    alembic.ini
                    env.py
                    versions/
Run Code Online (Sandbox Code Playgroud)

当我尝试从我的db目录运行以下内容时,我明白了

 File "migration/env.py", line 55, in run_migrations_online
    from configuration import app, db
ImportError: No module named configuration
Run Code Online (Sandbox Code Playgroud)

我尝试了请求一个简单的alembic工作示例中提到的自动生成迁移的解决方案,但它对我不起作用

env.py run_migrations_online()改变的方法是

def run_migrations_online():
    """Run migrations in 'online' mode.

    In this scenario we need to create an Engine
    and associate a connection with the context.

    """
    import os
    import sys

    sys.path.append(os.getcwd())
    from configuration …
Run Code Online (Sandbox Code Playgroud)

python flask flask-sqlalchemy alembic

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