标签: flask-sqlalchemy

Flask 和 SQLAlchemy db.session.commit 不工作

当我向表中添加测试用户时User,它添加得很好,即使我执行时也很好db.session.add(u),但当我执行时它会抛出错误db.session.commit()

from app import db

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.Integer(120), unique=True)
    email = db.Column(db.Integer(120), unique=True)
    configkey = db.Column(db.Integer(200), unique=True)
    dob = db.Column(db.DateTime)
    country = db.Column(db.Integer(120))
    friends = db.relationship('Friend', backref = 'friendof', lazy = 'dynamic')


    def __repr__(self):
        return '<User %r>' % (self.name)

class Friend(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.Integer(120), unique=True)
    email = db.Column(db.Integer(120), unique=True)
    dob = db.Column(db.DateTime)
    country = db.Column(db.Integer(120))
    lastmessage = db.Column(db.Integer(1500))
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))


    def __repr__(self): …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy flask flask-sqlalchemy

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

SQLAlchemy 关系,何时使用哪种关系?

我刚刚开始学习 Flask 并使用flask-sqlalchemy 包。我有一个模式,其中角色(id,名称)和用户(id,用户名,密码,role_id)和role_id是roles.id的外键。一对多关系,因为一个角色可以分配给许多用户,但每个用户都有一个角色。

在下面的代码中,

class Role(db.Model):
    # ..
    users = db.relationship('User', backref='role')

class User(db.Model):
    # ..
    role_id = db.Column(db.Integer, db.ForeignKey('roles.id')
Run Code Online (Sandbox Code Playgroud)

到这里,我已经建立了role_id的用法,但是为什么还需要db.relationship呢?关系选项有什么用以及在哪里使用:

  1. 反向引用
  2. 主连接
  3. 懒惰的
  4. 使用列表
  5. 订单依据
  6. 中学
  7. 二次连接

python sqlite sqlalchemy flask flask-sqlalchemy

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

Flask-SQLAlchemy 和 SQLAlchemy

我正在构建一个小型网站,并且我已经在 SQLAlchemy 中拥有了所有模型。该网站将发布一些离线计算的信息。只有结果会发布到精简数据库,即包含结果,而不是原始数据,但网站需要查询结果。

我将使用 Flask,因为我的模型已经使用 Python 驱动(并且通过 SWIG 在 C++ 中进行了一些繁重的工作),并且我不想使用 Django。

现在,在我确定之前就有人问过这个问题,而没有太多理由的通常口头禅是“使用 Flask-SQLAlchemy”。问题是为什么?

如果我自己编写一些会话处理,为什么我必须在 Flask-SQLAlchemy 中重新定义数据库的附加层。除了必须在我的 Flask 应用程序中的某个地方编写一些代码之外:

@app.before_request
def before_request():
  g.db = connect_db()

@app.teardown_request
def teardown_request(exception):
  db = getattr(g, 'db', None)
  if db is not None:
    db.close()
Run Code Online (Sandbox Code Playgroud)

我还需要担心什么?SQLAlchemy 甚至默认为我提供连接池。

python sqlalchemy flask flask-sqlalchemy

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

Python SQLAlchemy 属性事件 - 如何检查旧值等于 NO_VALUE?

SQLAlchemy 的官方文档指出:

\n\n
\n

oldvalue \xe2\x80\x93 被替换的先前值。这也可能是\n 符号NEVER_SETNO_VALUE。如果侦听器已注册 active_history=True,则如果现有值当前已卸载或过期,则将从数据库加载该属性的先前值。

\n
\n\n
from sqlalchemy import event\n\n# standard decorator style\n@event.listens_for(SomeClass.some_attribute, \'set\')\ndef receive_set(target, value, oldvalue, initiator):\n    "listen for the \'set\' event"\n\n    # ... (event handling logic) .\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的问题是如何检查旧值是否等于符号NO_VALUE

\n\n

我使用if oldvalue == symbol(NO_VALUE) 但它给了我错误。

\n\n
\n

类型错误:“模块”对象不可调用

\n
\n

python sqlalchemy flask-sqlalchemy

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

如何在 sqlAlchemy 模型的连接查询中使用 sum 和 count

我有工作 SQL,需要在使用 SQLAlchemy 作为 ORM 的工作 Flask 应用程序中表示。我可以表示连接等,但在连接总和、计数和其他特定选择元素 时却一事无成u.firstname || ' ' || u.lastname

SQL

select
  u.firstname || ' ' || u.lastname SELLER,
  count(i.id) UNIQUE_ITEMS,
  sum(i.qty) ITEMS_TOTAL,
  sum(i.qty * p.price) ORDER_AMOUNT
from
  orders o
  INNER JOIN order_items i
    on o.id = i.order_id
    and o.campaign_id = 133
  INNER JOIN products p
      ON i.product_id = p.id
  INNER JOIN users u
      ON o.user_id = u.id
GROUP BY u.id
ORDER BY sum(i.qty) DESC, sum(i.qty * p.price) DESC;
Run Code Online (Sandbox Code Playgroud)

和工作 Flask 实现:

orders = …
Run Code Online (Sandbox Code Playgroud)

python postgresql sqlalchemy flask-sqlalchemy

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

SQLAlchemy:如果联接返回多个结果,则仅显示最新结果

我正在尝试创建一个 Flask 应用程序来显示各个玩家的最新得分。所以一个玩家可以有多个分数,但在排行榜上我只想显示她最近的分数。

我的模型.py:

class Player(db.Model):
    __tablename__ = 'player'
    id = db.Column(db.Integer, primary_key=True)
    firstname = db.Column(db.String, nullable=False)
    score = db.relationship('Score', backref='player', lazy='dynamic')

    def __init__(self, firstname):
        self.firstname = firstname

    def __repr__(self):
        return '<id {}>'.format(self.id)


class Score(db.Model):
    __tablename__ = 'score'
    id = db.Column(db.Integer, primary_key=True)
    timestamp = db.Column(db.DateTime, nullable=False)
    score = db.Column(db.String, nullable=True)
    player_id = db.Column(db.Integer, db.ForeignKey('player.id'))

    def __init__(self, score, player_id):
        self.timestamp = datetime.now()
        self.score = score
        self.player_id = player_id

    def __repr__(self):
        return '<id {}>'.format(self.id)
Run Code Online (Sandbox Code Playgroud)

在我的 app.py 中,我有以下内容:

@app.route('/', methods=['GET', 'POST'])
@login_required
def …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy greatest-n-per-group flask flask-sqlalchemy

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

FlaskForm 验证码:检查用户是否已经存在

因此,当我谈到在注册帐户时检查用户名或电子邮件是否已被使用时,我正在关注 Corey Schafer 的 Flask 教程。我一生都无法理解这段代码是如何工作的,我想这是因为我是 Python 和 Flask 的新手,但它仍然不应该如此令人困惑。

class RegistrationForm(FlaskForm):

    username = StringField('Username', validators=[DataRequired(), Length(min=4,                                  
    max=20)])
    email = StringField('Email', validators=[DataRequired(), Email()])
    password = PasswordField('Password', validators=[DataRequired()])
    password_confirm = PasswordField('Confirm password', validators=[DataRequired(),EqualTo('password')])             
    submit = SubmitField('Sign Up')


def validate_username(self, username):
    user = User.query.filter_by(username=username.data).first()
    if user:
        raise ValidationError('That username is taken. Please choose 
        another.')

def validate_email(self, email):
    user = User.query.filter_by(email=email.data).first()
    if user:
        raise ValidationError('That email is taken. Please choose another.')
Run Code Online (Sandbox Code Playgroud)

那么,我不明白的具体部分是RegistrationForm类中的两个函数:首先,这两个函数如何知道用户名和电子邮件是什么?例如,如果我将函数定义中的“用户名”和“电子邮件”参数更改为“u_n”和“e_mail”之类的内容,然后使用“u_n.data”和“e_mail.data”运行查询,则代码仍然有效. 其次,如果我要将函数重命名为其他任何内容,代码将停止工作,我不明白为什么?

我知道这个问题的答案不能太复杂,但这让我非常恼火。任何帮助将不胜感激。

python flask flask-sqlalchemy flask-wtforms

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

使用一对多关系过滤flask-admin中的列值

我正在使用 flask-admin 创建管理界面。在我的管理面板中,我有 2 个表,第一个是位置,另一个是与位置有一对多关系的需求。我正在尝试在我的需求表单上过滤位置组合框,以便用户只能选择活动的组合框,但我无法管理它。是否可以?如果是的话,我该怎么做。

我试图用 form_ajax_refs 来做,但我失败了。

class Location(db.Model):
    __tablename__ = 'Locations'
    id = db.Column(db.Integer(), primary_key=True)
    name = db.Column(db.String(80), unique=True)
    active = db.Column(db.Boolean)

class Demand(db.Model):
    __tablename__ = 'Demands'
    id = db.Column(db.Integer(), primary_key=True)
    name = db.Column(db.String(80), unique=True)
    delivery_from_id = db.Column(db.Integer, db.ForeignKey('Locations.id'))
    delivery_from = db.relationship(Location,
                                    backref=db.backref('demands_from', lazy='dynamic'),
                                    foreign_keys=[delivery_from_id],
                                    )

class DemandView(ModelView):
        form_ajax_refs = {
            'delivery_from': QueryAjaxModelLoader('delivery_from', db.session, Location, fields=['name', 'active'],
                                                  filters=["active=True"]),
        }

admin.add_view(ModelView(Location, db.session, 'Locations'))
admin.add_view(DemandView(Demand, db.session, 'Demands'))
Run Code Online (Sandbox Code Playgroud)

flask flask-sqlalchemy flask-admin

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

在 SQLAlchemy 中检索查询结果作为 dict

我正在使用 Flask SQLAlchemy 并且我有以下代码可以使用来自 MySQL 数据库的原始 SQL 查询从数据库中获取用户:

connection = engine.raw_connection()
cursor = connection.cursor()
cursor.execute("SELECT * from User where id=0")
results = cursor.fetchall()
Run Code Online (Sandbox Code Playgroud)

results变量是一个元组,我希望它是 dict() 类型。有没有办法实现这一目标?

当我使用 pymysql 构建数据库连接时,我能够做到

cursor = connection.cursor(pymysql.cursors.DictCursor)
Run Code Online (Sandbox Code Playgroud)

SQLAlchemy 中是否有类似的东西?

注意:我想要做这个改变的原因是为了摆脱在我的代码中使用 pymysql,而只使用 SQLAlcehmy 功能,即我不想在我的代码中的任何地方使用 ´´´import pymysql´´´。

python mysql sqlalchemy flask-sqlalchemy

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

Flask SQLAlchemy 批量删除记录

我是 SQLAlchemy 的新手,我无法弄清楚如何一次删除多条记录。文档指出它与 .add() 相同,但使用 .delete() 代替。如果我附加 .first(),它会起作用,但是我不能使用 .all() 否则我会收到以下错误:

sqlalchemy.orm.exc.UnmappedInstanceError: Class 'builtins.list' is not mapped
Run Code Online (Sandbox Code Playgroud)

这是代码:

delete = Skilljoin.query.filter_by(staffid=30).all()
db.session.delete(delete)
db.session.commit()
Run Code Online (Sandbox Code Playgroud)

提前致谢。

python sql sqlalchemy flask flask-sqlalchemy

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