sqlalchemy增刪改查


今天整理一下flask-sqlalchemy對數據庫的操作, 基礎代碼如下

cat flaskStudy.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import os
basedir = os.path.abspath(os.path.dirname(__file__))

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'data.sqllist')
db = SQLAlchemy(app)

class Role(db.Model):
    __tablename__ = 'roles'
    users = db.relationship('User', backref='role')  # roles表與users表一對多的映射關系
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True)

    def __repr__(self):
        return "<Role %r>" % self.name

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))  # role_id 的值根據偽列role的值(指向roles對象)自動生成
    username = db.Column(db.String(64), unique=True, index=True)

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



if __name__ == '__main__':
    app.run()
  

  

  兩張表:roles, users, 一對多關系

1、數據插入

(venv) D:\flaskStudy>set FLASK_APP=flaskStudy.py

(venv) D:\flaskStudy>set FLASK_DEBUG=1

(venv) D:\flaskStudy>flask shell
Python 3.5.3 (v3.5.3:1880cb95a742, Jan 16 2017, 16:02:32) [MSC v.1900 64 bit (AMD64)] on win32
App: flaskStudy [production]
Instance: D:\flaskStudy\instance
>>> from flaskStudy import db, Role, User
>>> db.drop_all()  # 刪除所有表
>>> db.create_all() # 創建所有表
>>> admin_role=Role(name='Admin')  # 創建角色對象
>>> mod_role=Role(name='Moderator')
>>> user_role=Role(name='User')
>>> user_john=User(username='John',  role=admin_role)  # 創建用戶對象, 根據role對象動態生成role_id
>>> user_susan=User(username='susan', role=user_role)
>>> user_david=User(username='david', role=user_role)
>>> db.session.add(admin_role)
>>> db.session.add(mod_role)
>>> db.session.add(user_role)
>>> db.session.add(user_john)
>>> db.session.add(user_susan)
>>> db.session.add(user_david)
>>> db.session.commit()

  

2、數據查詢

(venv) D:\flaskStudy>flask shell
Python 3.5.3 (v3.5.3:1880cb95a742, Jan 16 2017, 16:02:32) [MSC v.1900 64 bit (AMD64)] on win32
App: flaskStudy [production]
Instance: D:\flaskStudy\instance
>>> from flaskStudy import db, User, Role
>>> user_role=Role.query.filter_by(name='User').first()  # 查詢一條roles數據
>>> user_role
<Role 'User'>
>>> user_role.users  # 根據users列正向查詢users表對應的用戶
[<User 'susan'>, <User 'david'>]
>>> user_david=User.query.filter_by(username='david').first() # 查詢一條用戶數據
>>> user_david
<User 'david'>
>>> user_david.role  # 根據偽列role查詢對應的角色
<Role 'User'>
>>>

 

3、數據修改

(venv) D:\flaskStudy>flask shell
Python 3.5.3 (v3.5.3:1880cb95a742, Jan 16 2017, 16:02:32) [MSC v.1900 64 bit (AMD64)] on win32
App: flaskStudy [production]
Instance: D:\flaskStudy\instance
>>> from flaskStudy import db, User, Role
>>> Role.query.all()  # roles表有三條數據
[<Role 'Admin'>, <Role 'Moderator'>, <Role 'User'>]
>>> admin_role=Role.query.filter_by(name='Admin').first()  # 查詢其中一條數據
>>> admin_role
<Role 'Admin'>
>>> admin_role.name='Administrator'  # 將name值修改為Administrator
>>> db.session.add(admin_role)
>>> db.session.commit()
>>> Role.query.all()
[<Role 'Administrator'>, <Role 'Moderator'>, <Role 'User'>]

  

4、刪除數據

>>> Role.query.all()  # 角色中三條記錄
[<Role 'Administrator'>, <Role 'Moderator'>, <Role 'User'>]
>>> user_role=Role.query.filter_by(name='User').first()  # 其中一條數據對象
>>> user_role
<Role 'User'>
>>> db.session.delete(user_role) # 刪除此對象
>>> db.session.commit()
>>> Role.query.all()
[<Role 'Administrator'>, <Role 'Moderator'>]
>>> User.query.all()  # users表中后兩條數據的role_id沒有了依賴被置空
[<User 'John'>, <User 'susan'>, <User 'david'>]

  

5、集成Python shell

  每次啟動flask shell會話都要手動導入數據庫實例和模型才能進行數據庫操作, 當啟動flask shell時如何實現自動導入呢?

  shell_context_processor:  注冊並創建一個shell上下文處理器。

@app.shell_context_processor  # 注冊並創建shell上下文處理器
def make_shell_context():
    return dict(db=db, User=User, Role=Role)  # 返回包含實例和模型的字典


再次運行flask shell, 這些實例和模型都可以使用了

(venv) D:\flaskStudy>flask shell
Python 3.5.3 (v3.5.3:1880cb95a742, Jan 16 2017, 16:02:32) [MSC v.1900 64 bit (AMD64)] on win32
App: flaskStudy [production]
Instance: D:\flaskStudy\instance
>>> db
<SQLAlchemy engine=sqlite:///D:\flaskStudy\data.sqllist>
>>> app
<Flask 'flaskStudy'>
>>> User
<class 'flaskStudy.User'>
>>> Role
<class 'flaskStudy.Role'>

  

6、創建遷移倉庫

  項目遷移后, 數據庫同樣需要遷移

from flask_migrate import Migrate
migrate = Migrate(app, db)

   db init子命令添加添加數據庫遷移支持, 此時自動創建目錄存儲數據 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM