当我向表中添加测试用户时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) 我刚刚开始学习 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呢?关系选项有什么用以及在哪里使用:
我正在构建一个小型网站,并且我已经在 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 甚至默认为我提供连接池。
\n\n\noldvalue \xe2\x80\x93 被替换的先前值。这也可能是\n 符号
\nNEVER_SET或NO_VALUE。如果侦听器已注册active_history=True,则如果现有值当前已卸载或过期,则将从数据库加载该属性的先前值。
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) .\nRun Code Online (Sandbox Code Playgroud)\n\n我的问题是如何检查旧值是否等于符号NO_VALUE?
我使用if oldvalue == symbol(NO_VALUE) 但它给了我错误。
\n\n类型错误:“模块”对象不可调用
\n
我有工作 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) 我正在尝试创建一个 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
因此,当我谈到在注册帐户时检查用户名或电子邮件是否已被使用时,我正在关注 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”运行查询,则代码仍然有效. 其次,如果我要将函数重命名为其他任何内容,代码将停止工作,我不明白为什么?
我知道这个问题的答案不能太复杂,但这让我非常恼火。任何帮助将不胜感激。
我正在使用 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 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´´´。
我是 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)
提前致谢。
flask-sqlalchemy ×10
python ×9
sqlalchemy ×8
flask ×7
flask-admin ×1
mysql ×1
postgresql ×1
sql ×1
sqlite ×1