62
A
回答
109
的行的名称列使用tutorial shown in the Flask-SQLAlchemy documentation检索的对象。一旦你有你想改变的实体,改变实体本身。然后,db.session.commit()
。
例如:
admin = User.query.filter_by(username='admin').first()
admin.email = '[email protected]'
db.session.commit()
user = User.query.get(5)
user.name = 'New Name'
db.session.commit()
瓶,SQLAlchemy的是基于SQLAlchemy的,所以一定要检查出SQLAlchemy Docs为好。
50
SQLAlchemy中的BaseQuery对象上有一个方法update
,它由filter_by
返回。
admin = User.query.filter_by(username='admin').update(dict(email='[email protected]')))
db.session.commit()
使用update
对不断变化的实体的优势是当有要更新许多对象。
如果你想给add_user
允许所有admin
S,
rows_changed = User.query.filter_by(role='admin').update(dict(permission='add_user'))
db.session.commit()
注意,filter_by
需要,而不是filter
这需要一个表达式关键字参数(只有一个=
使用)。
13
如果修改了模型的pickle属性,这不起作用。腌制属性应该以触发更新替代:
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
from pprint import pprint
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqllite:////tmp/users.db'
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), unique=True)
data = db.Column(db.PickleType())
def __init__(self, name, data):
self.name = name
self.data = data
def __repr__(self):
return '<User %r>' % self.username
db.create_all()
# Create a user.
bob = User('Bob', {})
db.session.add(bob)
db.session.commit()
# Retrieve the row by its name.
bob = User.query.filter_by(name='Bob').first()
pprint(bob.data) # {}
# Modifying data is ignored.
bob.data['foo'] = 123
db.session.commit()
bob = User.query.filter_by(name='Bob').first()
pprint(bob.data) # {}
# Replacing data is respected.
bob.data = {'bar': 321}
db.session.commit()
bob = User.query.filter_by(name='Bob').first()
pprint(bob.data) # {'bar': 321}
# Modifying data is ignored.
bob.data['moo'] = 789
db.session.commit()
bob = User.query.filter_by(name='Bob').first()
pprint(bob.data) # {'bar': 321}
3
就分配值,并承诺他们会为所有的数据类型,但JSON和腌属性工作。由于腌过的类型在上面解释过,所以我会记下一个稍微不同但简单的方法来更新JSON。
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), unique=True)
data = db.Column(db.JSON)
def __init__(self, name, data):
self.name = name
self.data = data
假设模型如上所述。
user = User("Jon Dove", {"country":"Sri Lanka"})
db.session.add(user)
db.session.flush()
db.session.commit()
这将增加用户到MySQL数据库与数据{“国”:“斯里兰卡”}
修改数据将被忽略。我的代码不起作用如下。
user = User.query().filter(User.name=='Jon Dove')
data = user.data
data["province"] = "south"
user.data = data
db.session.merge(user)
db.session.flush()
db.session.commit()
而不是通过复制JSON到一个新的字典(不是如上分配给新的变量),它应该有工作,我发现一个简单的方法来做到这一点的痛苦去工作的。有一种方法可以标记JSON已更改的系统。
以下是工作代码。
from sqlalchemy.orm.attributes import flag_modified
user = User.query().filter(User.name=='Jon Dove')
data = user.data
data["province"] = "south"
user.data = data
flag_modified(user, "data")
db.session.merge(user)
db.session.flush()
db.session.commit()
这工作就像一个魅力。 还有另一种方法与此方法一起提出here 希望我已经帮了一些人。
相关问题
- 1. 触发以更新一行信息
- 2. JFrame中的更新信息
- 3. MySQL根据行[id]更新'n'行数的新信息?
- 4. 更新AD信息字段中的一行
- 5. 更新DataColumn与最新的列信息
- 6. 更新$范围信息
- 7. PHP更新用户信息
- 8. 消除NPM“更新”信息
- 9. SQL Server - 更新信息4104
- 10. 更新用户信息
- 11. 通过更新信息
- 12. ACO信息素更新
- 13. Perl XML :: LibXML更新信息
- 14. 更新AD用户信息
- 15. 信息亭 - 内容更新
- 16. 更新用户信息
- 17. Sortable Table + Form +更新信息
- 18. 使用独特信息更新特定行的多行更新的语法
- 19. 如何更新Drupal中的客户信息信息:: Ubercart
- 20. 更新信息时插入新记录?
- 21. 如何用新信息更新JDialog?
- 22. 更新的客户详细信息
- 23. 用php更新mysql中的信息
- 24. 如何更新MKPinAnnotationView上的信息?
- 25. 更新laravel 5中的用户信息
- 26. 部分标题中的更新信息
- 27. 这会更新我的sql信息吗?
- 28. Android:更新活动间的bean信息
- 29. 无法更新JTable中的信息
- 30. 更新数据库中的信息
谢谢马克。另一件事。我已经看到它完成了像'db.add(用户)'然后'dv.session.commit()'。为什么这两个工作?有什么区别? – pocorschi
这与SQLAlchemy中临时对象,分离对象和附加对象之间的差异有关(请参阅http://www.sqlalchemy.org/docs/orm/session.html#what-does-the-session-do)。另外,请阅读Michael Bayer对邮件列表的评论(http://groups.google.com/group/sqlalchemy/browse_thread/thread/e38e2aba57aeed92?pli=1)了解更多信息。 –
如果您在阅读后仍然对差异感到困惑,请考虑提出另一个问题。 –