这是我当前模型的简化示例(我正在使用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) 背景: 我正在构建一个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) 我有一个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)
谢谢.
我的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) 我在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
我有一个表'test',其列'Name'没有约束.ALTER通过给它一个UNIQUE约束我需要这个专栏.我该怎么办?
我应该使用op.alter_column('???')或create_unique_constraint('???')?新列不是create_unique_constraint而不是现有列吗?
在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列以上的表怎么办?每次定义新模型时都必须定义构造函数吗?
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到两个parent及child表考虑到一个会话中parent_id必须包含在该child表中.在我创建child对象的那一刻,parent.id是None.
我怎样才能做到这一点?
我想创建一个表单,允许使用烧瓶表单发送带有描述的图片。我尝试使用此视频: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.uploads,flask_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) 我正在尝试将我的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) flask-sqlalchemy ×10
flask ×9
python ×8
sqlalchemy ×7
alembic ×2
json ×1
orm ×1
postgresql ×1
python-3.6 ×1