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