使用Flask-SQLAlchemy

Flask-SQLAlchemy入门

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)


class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)

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

根据上面代码,创建初始化数据库:
db.create_all()

flask-SQLAlchemy与原生SQLAlchemy之间的关联:

  • 在原生的SQLAlchemy中,我们这样使用:
    engine = create_engine('.........')
    Session_class = sessionmaker(bind=engine)
    session = Session_class() 然后对session进行add,commit等操作
    flask-SQLAlchemy中,这里连接成功数据库后,如果想直接使用sql语句提取数据库中表的内容:
    result = db.session.execute('select * from dbo.tbRevision')
    然后使用db.session进行对数据库的各种操作
  • 原生SQLAlchemy使用Base,这里使用db.Model
  • 原生SQLAlchemy使用engine,这里使用db.engine
  • ?是否原生的Base.metadata ==》db

从数据库中查询数据:
User.query.filter_by(username='admin').first()
这里不像原生的SQLAlchemy使用session.query(对象名)

建立关系型数据库表:

from datetime import datetime

class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(80), nullable=False)
    body = db.Column(db.Text, nullable=False)
    pub_date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)

    category_id = db.Column(db.Integer, db.ForeignKey('category.id'), nullable=False)
    category = db.relationship('Category', backref=db.backref('posts', lazy=True))
    
    def __repr__(self):
        return '<Post %r>' % self.title

class Category(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), nullable=False)

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

这里创建对象与原生SQLAlchemy的区别是,column和字段类型前面都要加上前缀db.

向这两个表里面插入数据:

>>> py = Category(name='Python')  #新建一个category分类实例
>>> Post(title='Hello Python!', body='Python is pretty cool', category=py)
>>> p = Post(title='Snakes', body='Ssssssss')  #新建一个post实例
>>> py.posts.append(p)   #根据两表的relationship,category有一个属性为posts, 在这个属性里面加入新建的post实例
>>> db.session.add(py)   #直接在会话中加入新建的category实例,因为新建的post已经在里面了

使用一条query查询所有的category分类,以及它对应的所有post:

from sqlalchemy.orm import joinedload
query = category.query.options(joinedload('posts'))
for category in query:
	print category, category.posts

如果想得到所有除了分类为某某的所有post:
Post.query.with_parent(py).filter(Post.title != 'Snakes').all()

支持automap,提取数据库已有表:

 app = Flask(__name__)
 app.config['SQLALCHEMY_DATABASE_URI'] = 'database_uri'
 db = SQLAlchemy(app)
 metadata = MetaData()
 tables = ['user']
 metadata.reflect(db.engine, only=tables)
 Base = automap_base(metadata=metadata)
 Base.prepare(name_for_scalar_relationship=name_for_scalar_relationship,
              name_for_collection_relationship=name_for_collection_relationship)

@app.route('/test')
def test_request():
    User = Base.classes.user
    usr = db.session.query(User).filter_by(username='nexero').first()
    return usr.username

这里使用的db.engine即为原生SQLAlchemy中的engine

猜你喜欢

转载自blog.csdn.net/qq_43355223/article/details/83269763
今日推荐