标签: flask-sqlalchemy

无法使用flask-sqlalchemy创建自动增量主键

我希望我的模型的主键是一个自动递增的整数.这是我的模型的样子

class Region(db.Model):
    __tablename__ = 'regions'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(100))
    parent_id = db.Column(db.Integer, db.ForeignKey('regions.id'))
    parent = db.relationship('Region', remote_side=id, primaryjoin=('Region.parent_id==Region.id'), backref='sub-regions')
    created_at = db.Column(db.DateTime, default=db.func.now())
    deleted_at = db.Column(db.DateTime)
Run Code Online (Sandbox Code Playgroud)

上面的代码创建了我的表,但没有id自动增量.因此,如果在我的插入查询中我错过了该id字段,它会给我这个错误

错误:列"id"中的空值违反非空约束

所以我把id声明改成了这样的样子

id = db.Column(db.Integer, db.Sequence('seq_reg_id', start=1, increment=1),
               primary_key=True)
Run Code Online (Sandbox Code Playgroud)

还是一样的错误.上面的代码有什么问题?

python postgresql sqlalchemy flask flask-sqlalchemy

36
推荐指数
5
解决办法
5万
查看次数

无效的事务在请求之间保持不变

摘要

我们生产中的一个线程遇到了一个错误,现在正在产生InvalidRequestError: This session is in 'prepared' state; no further SQL can be emitted within this transaction.错误,每次请求都有一个查询它服务的余生!现在已经好几天了!这怎么可能,我们如何防止它向前发展?

背景

我们在uWSGI上使用Flask应用程序(4个进程,2个线程),Flask-SQLAlchemy为我们提供了与SQL Server的数据库连接.

当我们的一个生产线程正在拆除它的请求时,问题似乎开始了,在这个Flask-SQLAlchemy方法中:

@teardown
def shutdown_session(response_or_exc):
    if app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN']:
        if response_or_exc is None:
            self.session.commit()
    self.session.remove()
    return response_or_exc
Run Code Online (Sandbox Code Playgroud)

...... self.session.commit()当事务无效时,以某种方式设法调用.这导致sqlalchemy.exc.InvalidRequestError: Can't reconnect until invalid transaction is rolled back输出到stdout,无视我们的日志记录配置,这是有道理的,因为它发生在应用程序上下文拆除期间,这从来不应该引发异常.我不确定如果没有response_or_exec设置,交易如何变得无效,但这实际上是AFAIK的较小问题.

更大的问题是,当"准备好的'状态"错误开始时,并且从那时起就没有停止过.每次这个线程提供命中数据库的请求时,它就是500s.每个其他线程似乎都没问题:据我所知,即使是在同一进程中的线程也没问题.

胡乱猜测

SQLAlchemy邮件列表中有一个关于"'准备好的'状态"错误的条目,说明如果会话开始提交但尚未完成,而其他东西试图使用它.我的猜测是,这个帖子中的会话永远不会self.session.remove()迈出这一步,现在它永远不会.

我仍然觉得这并没有解释这个会话如何在请求中持续存在.我们还没有修改Flask-SQLAlchemy对请求范围会话的使用,因此会话应该返回到SQLAlchemy的池并在请求结束时回滚,即使是错误的(尽管可能不是第一个,因为在应用程序上下文中引发的内容被拆除了).为什么回滚没有发生?如果我们每次都看到stdout上的"无效事务"错误(在uwsgi的日志中),我就能理解它,但我们不是:我第一次只看到它一次.但每次500秒发生时,我都会看到"准备好的状态"错误(在我们的应用程序日志中).

配置细节

我们已经关闭expire_on_commitsession_options,我们已经开启了SQLALCHEMY_COMMIT_ON_TEARDOWN.我们只是从数据库中读取,而不是写作.我们还使用Dogpile-Cache进行所有查询(使用memcached锁,因为我们有多个进程,实际上是2个负载均衡的服务器).缓存会在每分钟到期,因为我们的主要查询.

更新2014-04-28:解决步骤

重启服务器似乎已经解决了问题,这并不奇怪.也就是说,我希望能再次看到它,直到我们弄清楚如何阻止它.benselme(下面)建议编写我们自己的拆解回调,并在提交时进行异常处理,但我觉得更大的问题是该线程在其余生中被搞砸了.事实上,在一两个请求之后这并没有消失,这让我很紧张!

python sqlalchemy flask uwsgi flask-sqlalchemy

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

如何在Celery任务中使用Flask-SQLAlchemy

我最近切换到Celery 3.0.在此之前,我使用Flask-Celery将Celery与Flask整合在一起.虽然它有许多问题,比如隐藏了一些强大的Celery功能,但它允许我使用Flask app的完整上下文,尤其是Flask-SQLAlchemy.

在我的后台任务中,我正在处理数据,而SQLAlchemy ORM则用于存储数据.Flask-Celery的维护者已经放弃了对该插件的支持.该插件在任务中挑选了Flask实例,因此我可以完全访问SQLAlchemy.

我试图在我的tasks.py文件中复制此行为,但没有成功.你有任何关于如何实现这一目标的提示吗?

python celery flask flask-sqlalchemy

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

无法为映射表组装任何主键列

当我尝试创建数据库模式迁移时,我遇到了这个奇怪的错误.你能帮我弄清楚出了什么问题吗?

$ python app.py db upgrade
[skipped]
sqlalchemy.exc.ArgumentError: Mapper Mapper|EssayStateAssociations|essay_associations could not assemble any primary key columns for mapped table 'essay_associations'
Run Code Online (Sandbox Code Playgroud)

我的模特:

class EssayStateAssociations(db.Model):
    __tablename__ = 'essay_associations'

    application_essay_id = db.Column(
        db.Integer,
        db.ForeignKey("application_essay.id"),
        primary_key=True),
    theme_essay_id = db.Column(
        db.Integer,
        db.ForeignKey("theme_essay.id"),
        primary_key=True),
    state = db.Column(db.String, default="pending")
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy flask-sqlalchemy flask-migrate

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

如何在SQLAlchemy查询中使用avg和sum

我正在尝试从我的数据集返回一个总计/平均行,其中包含某些字段的SUM和其他字段的AVG.

我可以在SQL中执行以下操作:

SELECT SUM(field1) as SumFld, AVG(field2) as AvgFld 
FROM Rating WHERE url=[url_string]
Run Code Online (Sandbox Code Playgroud)

我将此转换为SQLAlchemy的尝试如下:

totals = Rating.query(func.avg(Rating.field2)).filter(Rating.url==url_string.netloc)
Run Code Online (Sandbox Code Playgroud)

但这是错误的:

TypeError: 'BaseQuery' object is not callable
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy flask flask-sqlalchemy

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

在Flask中按文件分隔SQLAlchemy模型

对,我已经看到了直接存储在主应用程序文件(机型瓶应用的许多例子http://pythonhosted.org/Flask-SQLAlchemy/quickstart.html,http://maximebf.com/blog/2012/10/建设网站-in-python-with-flask /).其他的(http://flask.pocoo.org/docs/patterns/sqlalchemy/)有一个"models.py"文件,其中放置了模型.

如何从单独的文件中取出我的Flask app导入模型,例如"User.py"?当我尝试使用这些内容创建User.py文件时:

from app import db

class User(db.Model):
    [...]
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

File "/Users/stackoverflow/myapp/models/User.py", line 1, in <module>
from app import db
ImportError: No module named app
Run Code Online (Sandbox Code Playgroud)

当我插入from models import User我的模块文件.

python sqlalchemy flask flask-sqlalchemy

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

sqlalchemy:使用参数绑定执行原始sql

我正在尝试使用带有SQLALchemy的参数(在一个alembic脚本中)运行这个简单的原始sql语句:

from alembic import op

t = {"code": "123", "description": "one two three"}

op.execute("insert into field_tags (id, field_id, code, description) "+
               "values (1,'zasz', :code ,:description')", t)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

sqlalchemy.exc.StatementError: A value is required for bind parameter 
  'description' (original cause: InvalidRequestError: A value is required for 
  bind parameter 'description') "insert into field_tags (id, field_id, code, 
  description) values (1, 'math', 
  %(code)s ,%(description)s)" []
Run Code Online (Sandbox Code Playgroud)

解决方案:

t = {"code": "123", "description": "one two three"}
from sqlalchemy.sql import text

op.get_bind().execute(text("insert into field_tags (id, field_id, code, description) …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy database-migration flask-sqlalchemy alembic

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

alembic util命令错误找不到标识符

我正在尝试使用alembic来处理我项目的本地迁移.它第一次工作,但后来我需要删除文件夹并重新启动.(不要问为什么,我只是必须)我正在按照本教程运行命令

python manage.py db init
Run Code Online (Sandbox Code Playgroud)

没关系.但是当我试着奔跑的时候

python manage.py db migrate
Run Code Online (Sandbox Code Playgroud)

我收到这个错误:

alembic.util.CommandError: Can't locate revision identified by '31b8ab83c7d'
Run Code Online (Sandbox Code Playgroud)

现在,似乎alembic正在寻找不再存在的修订版.无论如何,让alembic忘记那个文件?或者重新启动比较从无到 - >再次自动生成?

postgresql sqlalchemy-migrate flask-sqlalchemy alembic

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

使用Flask-SQLAlchemy和Blueprints循环导入db引用

我正在使用Flask-SQLAlchemy和Blueprints,我无法使用循环导入.我知道我可以在函数内部编写导入并使其工作但它听起来很讨厌,我想与社区确认是否有更好的方法来做到这一点.

问题是我有一个模块(blueprints.py),我在其中声明数据库并导入蓝图,但这些蓝图需要同时导入数据库声明.

这是代码(重要部分的摘录):

application.apps.people.views.py

from application.blueprints import db

people = Blueprint('people', __name__,
                 template_folder='templates',
                 static_folder='static')

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)

@people.route('/all')
def all():
    users = User.query.all()
Run Code Online (Sandbox Code Playgroud)

application.blueprints.py

from application.apps.people.views import people

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)
app.register_blueprint(people, url_prefix='/people')
Run Code Online (Sandbox Code Playgroud)

我已经阅读了文档和我在这个主题上发现的问题,但我仍然找不到我要找的答案.我已经找到了这一章(https://pythonhosted.org/Flask-SQLAlchemy/contexts.html),它建议将初始化代码放在方法中,但循环导入仍然存在.

编辑 我使用模式Application Factory修复了问题

flask flask-sqlalchemy

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

sqlalchemy外键关系属性

我有一个User表和一个Friend表.Friend表包含两个外键,包括我的User表和状态字段.我试图能够在Friend对象上调用我的User表中的属性.例如,我希望能够做一些像friend.name或friend.email这样的事情.

class User(Base):
    """ Holds user info """

    __tablename__ = 'user'
    id = Column(Integer, primary_key=True)
    name = Column(String(25), unique=True)
    email = Column(String(50), unique=True)
    password = Column(String(25))
    admin = Column(Boolean)

    # relationships
    friends = relationship('Friend', backref='Friend.friend_id',primaryjoin='User.id==Friend.user_id', lazy='dynamic')

class Friend(Base):
    __tablename__ = 'friend'

    user_id = Column(Integer, ForeignKey(User.id), primary_key=True)
    friend_id = Column(Integer, ForeignKey(User.id), primary_key=True)
    request_status = Column(Boolean)
Run Code Online (Sandbox Code Playgroud)

当我获得friend对象时我只有2 user_ids并且我希望显示每个用户的所有属性,以便我可以在表单等中使用该信息.我是sqlalchemy的新手 - 仍在尝试学习更多高级功能.这只是一个较大的Flask项目的片段,这个功能将用于friend请求等.我试图查找关联对象等,但我很难用它.

任何帮助将不胜感激.

python sqlalchemy flask-sqlalchemy

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