SQLAlchemy 是一個很強大的關係型數據庫框架,處於數據庫抽象層 ,支持多種數據庫後臺。 提供了高層 ORM,也提供了使用數據庫原生 SQL 的低層功能。html
首先,激活virtualenv虛擬環境,在虛擬環境安裝目錄的同級目錄下使用命令python
venv\Scripts\activate
命令行前出現virtualenv
則表示激活成功sql
而後,安裝Flask-SQLAlchemyshell
pip install flask-sqlalchemy
from flask.ext.sqlalchemy import SQLAlchemy basedir = os.path.abspath(os.path.dirname(__file__)) app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] =\ 'sqlite:///' + os.path.join(basedir, 'data.sqlite') app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True db = SQLAlchemy(app)
db
對象:是 SQLAlchemy 類的實例,表示程序使用的數據庫,同時還得到了 Flask-SQLAlchemy
提供的全部功能。
SQLALCHEMY_DATABASE_URI
:程序使用的數據庫 URL
SQLALCHEMY_COMMIT_ON_TEARDOWN
:將其設爲 True 時,每次請求結束後都會自動提交數據庫中的變更數據庫
在 ORM 中,模型通常是一個 Python 類,類中的屬性對應數據庫表中的列。flask
class User(db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(64), unique=True, index=True) def __repr__(self): return '<User %r>' % self.username
__tablename__
:定義在數據庫中使用的表名。若是沒有定義 tablename,Flask-SQLAlchemy 會使用一個默認名字。
其他的類變量都是該模型的屬性,被定義爲 db.Column類的實例。db.Column 類構造函數的第一個參數是數據庫列和模型屬性的類型。session
讓 Flask-SQLAlchemy 根據模型類建立數據庫。方法是使用 db.create_all()
函數:app
(venv) $ python hello.py shell >>> from hello import db >>> db.create_all()
查看程序目錄,會發現新建了一個名爲 data.sqlite 的文件。若是數據庫表已經存在於數據庫中,那麼 db.create_all()不會從新建立或者更新這個表。若是修改模型後要把改動應用到現有的數據庫中,這一特性會帶來不便。粗暴的解決方式是先刪除再重建使用>>> db.drop_all()
和>>> db.create_all()
,數據庫裏的數據也會被刪除。因此使用Flask-Migrate
插件,這個插件對數據庫遷移框架Alembic 作了輕量級包裝,並集成到 Flask-Script 中,全部操做都經過 Flask-Script 命令完成。接下來的操做前提是安裝並使用了Flask-Migrate。
(備註: 使用Flask-Migrate後,爲表新增字段後必須通過一下兩條命令才能使新模型生效框架
(venv) $ python hello.py db migrate -m "initial migration" #自動建立遷移腳本 (venv) $ python hello.py db upgrade #更新數據庫,且不影響其中保存的數據
)函數
模型名.query.all()
取對應表中的全部記錄:
>>> User.query.all() [<User u'john'>]
可經過查看原生語句查看該表的字段
>>> str(User.query) 'SELECT users.id AS users_id, users.email AS users_email, users.username AS users_username, users.role_id AS users_role_id, users.password_hash AS users_password_hash, users.confirmed AS users_confirmed \nFROM users \nWHERE users.username = ?'
能夠看到模型User對應的表users中的字段有,id, email, username, role_id等
先取到數據再修改而後將修改存回表中
>>> User.query.get(1) <User u'john'> >>> u=User.query.get(1) #取數據 >>> print u.email john@example.com >>> u.email='john@qq.com' #修改數據 >>> db.session.add(u) #添加 >>> db.session.commit() #提交修改 >>> User.query.get(1).email #查看修改後數據 u'john@qq.com'
>>> db.session.delete(u) >>> db.session.commit()
>>> u = User(email='john@example.com', username='john', password='cat') >>> db.session.add(u) >>> db.session.commit()