时间:2021-07-01 10:21:17 帮助过:22人阅读
一旦创建,这个对象就包含 sqlalchemy
和 sqlalchemy.orm
中的所有函数和助手。此外它还提供一个名为 Model 的类,用于作为声明模型时的 delarative 基类:
- <span style="color: #0000ff">from</span> flask <span style="color: #0000ff">import</span><span style="color: #000000"> Flask
- </span><span style="color: #0000ff">from</span> flask.ext.sqlalchemy <span style="color: #0000ff">import</span><span style="color: #000000"> SQLAlchemy
- app </span>= Flask(<span style="color: #800080">__name__</span><span style="color: #000000">)
- 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">
- db </span>=<span style="color: #000000"> SQLAlchemy(app)
- </span><span style="color: #0000ff">class</span><span style="color: #000000"> User(db.Model):
- id </span>= db.Column(db.Integer, primary_key=<span style="color: #000000">True)
- username </span>= db.Column(db.String(80), unique=<span style="color: #000000">True)
- email </span>= db.Column(db.String(120), unique=<span style="color: #000000">True)
- </span><span style="color: #0000ff">def</span> <span style="color: #800080">__init__</span><span style="color: #000000">(self, username, email):
- self.username </span>=<span style="color: #000000"> username
- self.email </span>=<span style="color: #000000"> email
- </span><span style="color: #0000ff">def</span> <span style="color: #800080">__repr__</span><span style="color: #000000">(self):
- </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()
方法来创建表和数据库:
- >>> <span style="color: #0000ff">from</span> yourapplication <span style="color: #0000ff">import</span><span style="color: #000000"> db
- </span>>>> db.create_all()
Boom, 您的数据库已经生成。现在来创建一些用户:
- >>> <span style="color: #0000ff">from</span> yourapplication <span style="color: #0000ff">import</span><span style="color: #000000"> User
- </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">)
- </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>)
但是它们还没有真正地写入到数据库中,因此让我们来确保它们已经写入到数据库中:
- >>><span style="color: #000000"> db.session.add(admin)
- </span>>>><span style="color: #000000"> db.session.add(guest)
- </span>>>> db.session.commit()
访问数据库中的数据也是十分简单的:
- >>> users =<span style="color: #000000"> User.query.all()
- [</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">]
- </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()
- </span><User u<span style="color: #800000">‘</span><span style="color: #800000">admin</span><span style="color: #800000">‘</span>>
SQLAlchemy 连接到关系型数据库,关系型数据最擅长的东西就是关系。因此,我们将创建一个使用两张相互关联的表的应用作为例子:
- <span style="color: #0000ff">from</span> datetime <span style="color: #0000ff">import</span><span style="color: #000000"> datetime
- </span><span style="color: #0000ff">class</span><span style="color: #000000"> Post(db.Model):
- id </span>= db.Column(db.Integer, primary_key=<span style="color: #000000">True)
- title </span>= db.Column(db.String(80<span style="color: #000000">))
- body </span>=<span style="color: #000000"> db.Column(db.Text)
- pub_date </span>=<span style="color: #000000"> db.Column(db.DateTime)
- 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">))
- category </span>= db.relationship(<span style="color: #800000">‘</span><span style="color: #800000">Category</span><span style="color: #800000">‘</span><span style="color: #000000">,
- 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">))
- </span><span style="color: #0000ff">def</span> <span style="color: #800080">__init__</span>(self, title, body, category, pub_date=<span style="color: #000000">None):
- self.title </span>=<span style="color: #000000"> title
- self.body </span>=<span style="color: #000000"> body
- </span><span style="color: #0000ff">if</span> pub_date <span style="color: #0000ff">is</span><span style="color: #000000"> None:
- pub_date </span>=<span style="color: #000000"> datetime.utcnow()
- self.pub_date </span>=<span style="color: #000000"> pub_date
- self.category </span>=<span style="color: #000000"> category
- </span><span style="color: #0000ff">def</span> <span style="color: #800080">__repr__</span><span style="color: #000000">(self):
- </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
- </span><span style="color: #0000ff">class</span><span style="color: #000000"> Category(db.Model):
- id </span>= db.Column(db.Integer, primary_key=<span style="color: #000000">True)
- name </span>= db.Column(db.String(50<span style="color: #000000">))
- </span><span style="color: #0000ff">def</span> <span style="color: #800080">__init__</span><span style="color: #000000">(self, name):
- self.name </span>=<span style="color: #000000"> name
- </span><span style="color: #0000ff">def</span> <span style="color: #800080">__repr__</span><span style="color: #000000">(self):
- </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
首先让我们创建一些对象:
- >>> py = Category(<span style="color: #800000">‘</span><span style="color: #800000">Python</span><span style="color: #800000">‘</span><span style="color: #000000">)
- </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)
- </span>>>><span style="color: #000000"> db.session.add(py)
- </span>>>> db.session.add(p)
现在因为我们在 backref 中声明了 posts 作为动态关系,查询显示为:
- >>><span style="color: #000000"> py.posts
- </span><sqlalchemy.orm.dynamic.AppenderBaseQuery object at 0x1027d37d0>
它的行为像一个普通的查询对象,因此我们可以查询与我们测试的 “Python” 分类相关的所有文章(posts):
- >>><span style="color: #000000"> py.posts.all()
- [</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