当前位置:Gxlcms > 数据库问题 > flask-sqlalchemy

flask-sqlalchemy

时间:2021-07-01 10:21:17 帮助过:22人阅读

 对象时候把 Flask 应用传递给它作为参数。

一旦创建,这个对象就包含 sqlalchemy 和 sqlalchemy.orm 中的所有函数和助手。此外它还提供一个名为 Model 的类,用于作为声明模型时的 delarative 基类:

  1. <span style="color: #0000ff">from</span> flask <span style="color: #0000ff">import</span><span style="color: #000000"> Flask
  2. </span><span style="color: #0000ff">from</span> flask.ext.sqlalchemy <span style="color: #0000ff">import</span><span style="color: #000000"> SQLAlchemy
  3. app </span>= Flask(<span style="color: #800080">__name__</span><span style="color: #000000">)
  4. app.config[</span><span style="color: #800000">‘</span><span style="color: #800000">SQLALCHEMY_DATABASE_URI</span><span style="color: #800000">‘</span>] = <span style="color: #800000">‘</span><span style="color: #800000">sqlite:////tmp/test.db</span><span style="color: #800000">‘</span><span style="color: #000000">
  5. db </span>=<span style="color: #000000"> SQLAlchemy(app)
  6. </span><span style="color: #0000ff">class</span><span style="color: #000000"> User(db.Model):
  7. id </span>= db.Column(db.Integer, primary_key=<span style="color: #000000">True)
  8. username </span>= db.Column(db.String(80), unique=<span style="color: #000000">True)
  9. email </span>= db.Column(db.String(120), unique=<span style="color: #000000">True)
  10. </span><span style="color: #0000ff">def</span> <span style="color: #800080">__init__</span><span style="color: #000000">(self, username, email):
  11. self.username </span>=<span style="color: #000000"> username
  12. self.email </span>=<span style="color: #000000"> email
  13. </span><span style="color: #0000ff">def</span> <span style="color: #800080">__repr__</span><span style="color: #000000">(self):
  14. </span><span style="color: #0000ff">return</span> <span style="color: #800000">‘</span><span style="color: #800000"><User %r></span><span style="color: #800000">‘</span> % self.username

为了创建初始数据库,只需要从交互式 Python shell 中导入 db 对象并且调用 SQLAlchemy.create_all() 方法来创建表和数据库:

  1. >>> <span style="color: #0000ff">from</span> yourapplication <span style="color: #0000ff">import</span><span style="color: #000000"> db
  2. </span>>>> db.create_all()

Boom, 您的数据库已经生成。现在来创建一些用户:

  1. >>> <span style="color: #0000ff">from</span> yourapplication <span style="color: #0000ff">import</span><span style="color: #000000"> User
  2. </span>>>> admin = User(<span style="color: #800000">‘</span><span style="color: #800000">admin</span><span style="color: #800000">‘</span>, <span style="color: #800000">‘</span><span style="color: #800000">admin@example.com</span><span style="color: #800000">‘</span><span style="color: #000000">)
  3. </span>>>> guest = User(<span style="color: #800000">‘</span><span style="color: #800000">guest</span><span style="color: #800000">‘</span>, <span style="color: #800000">‘</span><span style="color: #800000">guest@example.com</span><span style="color: #800000">‘</span>)

但是它们还没有真正地写入到数据库中,因此让我们来确保它们已经写入到数据库中:

  1. >>><span style="color: #000000"> db.session.add(admin)
  2. </span>>>><span style="color: #000000"> db.session.add(guest)
  3. </span>>>> db.session.commit()

访问数据库中的数据也是十分简单的:

  1. >>> users =<span style="color: #000000"> User.query.all()
  2. [</span><User u<span style="color: #800000">‘</span><span style="color: #800000">admin</span><span style="color: #800000">‘</span>>, <User u<span style="color: #800000">‘</span><span style="color: #800000">guest</span><span style="color: #800000">‘</span>><span style="color: #000000">]
  3. </span>>>> admin = User.query.filter_by(username=<span style="color: #800000">‘</span><span style="color: #800000">admin</span><span style="color: #800000">‘</span><span style="color: #000000">).first()
  4. </span><User u<span style="color: #800000">‘</span><span style="color: #800000">admin</span><span style="color: #800000">‘</span>>

简单的关系

SQLAlchemy 连接到关系型数据库,关系型数据最擅长的东西就是关系。因此,我们将创建一个使用两张相互关联的表的应用作为例子:

  1. <span style="color: #0000ff">from</span> datetime <span style="color: #0000ff">import</span><span style="color: #000000"> datetime
  2. </span><span style="color: #0000ff">class</span><span style="color: #000000"> Post(db.Model):
  3. id </span>= db.Column(db.Integer, primary_key=<span style="color: #000000">True)
  4. title </span>= db.Column(db.String(80<span style="color: #000000">))
  5. body </span>=<span style="color: #000000"> db.Column(db.Text)
  6. pub_date </span>=<span style="color: #000000"> db.Column(db.DateTime)
  7. category_id </span>= db.Column(db.Integer, db.ForeignKey(<span style="color: #800000">‘</span><span style="color: #800000">category.id</span><span style="color: #800000">‘</span><span style="color: #000000">))
  8. category </span>= db.relationship(<span style="color: #800000">‘</span><span style="color: #800000">Category</span><span style="color: #800000">‘</span><span style="color: #000000">,
  9. backref</span>=db.backref(<span style="color: #800000">‘</span><span style="color: #800000">posts</span><span style="color: #800000">‘</span>, lazy=<span style="color: #800000">‘</span><span style="color: #800000">dynamic</span><span style="color: #800000">‘</span><span style="color: #000000">))
  10. </span><span style="color: #0000ff">def</span> <span style="color: #800080">__init__</span>(self, title, body, category, pub_date=<span style="color: #000000">None):
  11. self.title </span>=<span style="color: #000000"> title
  12. self.body </span>=<span style="color: #000000"> body
  13. </span><span style="color: #0000ff">if</span> pub_date <span style="color: #0000ff">is</span><span style="color: #000000"> None:
  14. pub_date </span>=<span style="color: #000000"> datetime.utcnow()
  15. self.pub_date </span>=<span style="color: #000000"> pub_date
  16. self.category </span>=<span style="color: #000000"> category
  17. </span><span style="color: #0000ff">def</span> <span style="color: #800080">__repr__</span><span style="color: #000000">(self):
  18. </span><span style="color: #0000ff">return</span> <span style="color: #800000">‘</span><span style="color: #800000"><Post %r></span><span style="color: #800000">‘</span> %<span style="color: #000000"> self.title
  19. </span><span style="color: #0000ff">class</span><span style="color: #000000"> Category(db.Model):
  20. id </span>= db.Column(db.Integer, primary_key=<span style="color: #000000">True)
  21. name </span>= db.Column(db.String(50<span style="color: #000000">))
  22. </span><span style="color: #0000ff">def</span> <span style="color: #800080">__init__</span><span style="color: #000000">(self, name):
  23. self.name </span>=<span style="color: #000000"> name
  24. </span><span style="color: #0000ff">def</span> <span style="color: #800080">__repr__</span><span style="color: #000000">(self):
  25. </span><span style="color: #0000ff">return</span> <span style="color: #800000">‘</span><span style="color: #800000"><Category %r></span><span style="color: #800000">‘</span> % self.name

首先让我们创建一些对象:

  1. >>> py = Category(<span style="color: #800000">‘</span><span style="color: #800000">Python</span><span style="color: #800000">‘</span><span style="color: #000000">)
  2. </span>>>> p = Post(<span style="color: #800000">‘</span><span style="color: #800000">Hello Python!</span><span style="color: #800000">‘</span>, <span style="color: #800000">‘</span><span style="color: #800000">Python is pretty cool</span><span style="color: #800000">‘</span><span style="color: #000000">, py)
  3. </span>>>><span style="color: #000000"> db.session.add(py)
  4. </span>>>> db.session.add(p)

现在因为我们在 backref 中声明了 posts 作为动态关系,查询显示为:

  1. >>><span style="color: #000000"> py.posts
  2. </span><sqlalchemy.orm.dynamic.AppenderBaseQuery object at 0x1027d37d0>

它的行为像一个普通的查询对象,因此我们可以查询与我们测试的 “Python” 分类相关的所有文章(posts):

  1. >>><span style="color: #000000"> py.posts.all()
  2. [</span><Post <span style="color: #800000">‘</span><span style="color: #800000">Hello Python!</span><span style="color: #800000">‘</span>>]

 

flask-sqlalchemy

标签:example   eth   filter   primary   ssi   cal   utils   包含   scalar   

人气教程排行