使用Flask-SQLALchemy操作MySQL資料庫

來源:互聯網
上載者:User

標籤:flask   flask-sqlalchemy   


1、簡介

Flask-SQLAlchemy 是一個 Flask 擴充,簡化了在 Flask程式中使用SQLAlchemy 的操作。SQLAlchemy 是一個很強大的關係型資料庫架構,支援多種資料庫後台。 SQLAlchemy 提供了高層 ORM,也提供了使用資料庫原生 SQL 的低層功能。

2、安裝

$ pip install flask-sqlalchemy

3、配置串連mysql

$ vim models.py

from flask importFlask

from flask_script import Manager

from flask_sqlalchemy import SQLAlchemy

app =Flask(__name__)

app.config[‘SQLALCHEMY_DATABASE_URI‘] = ‘mysql://kevin:[email protected]/kevin‘

app.config[‘SQLALCHEMY_COMMIT_ON_TEARDOWN‘] = True

manager = Manager(app)

db = SQLAlchemy(app)

 

if __name__ ==‘__main__‘:

manager.run()

4、定義模型

$ vim models.py(只列出修改部分)

db = SQLAlchemy(app)

class Role(db.Model):

    __tablename__ = ‘roles‘

    id = db.Column(db.Integer,primary_key=True)

    name = db.Column(db.String(255),unique=True)

    users = db.relationship(‘User‘,backref=‘role‘)

    def __repr__(self):

        return ‘<Role %r>‘ %self.name

 

class User(db.Model):

    __tablename__ = ‘users‘

    id = db.Column(db.Integer,primary_key=True)

    username = db.Column(db.String(255),unique=True,index=True)

    password = db.Column(db.String(255))

    role_id = db.Column(db.Integer,db.ForeignKey(‘roles.id‘))

    def __repr__(self):

        return ‘<User %r>‘ %self.username

類變數 __tablename__ 定義在資料庫中使用的表名。如果沒有定義 __tablename__, Flask-SQLAlchemy 會使用模版名的小寫作為表名。

不需要定義__init__或__repr__,如果沒有定義,SQLAlchemy會自動建立__init__方法。如果定義了,定義的欄位名會成為此方法所接收的關鍵字參數名。

5、資料庫操作

5.1、建立表

建立資料庫,方法是使用db.create_all()函數。如果資料庫表已經存在於資料庫中,那麼 db.create_all()不會重新建立或者更新這個表。

查看資料庫

mysql> use kevin

Database changed

mysql> show tables;

Empty set (0.00sec)

建立

$ python models.py shell

>>> from models import db

>>>db.create_all()

查看

mysql> show tables;

+-----------------+

| Tables_in_kevin |

+-----------------+

| roles           |

| users           |

+-----------------+

2 rows in set (0.00sec)

5.2、插入資料

>>> from  models import Role,User

>>>admin_role = Role(name=‘Admin‘)

>>>mod_role = Role(name=‘Moderator‘)

>>>user_role = Role(name=‘User‘)

>>>user_kevin = User(username=‘kevin‘,role=admin_role)

>>>user_susan = User(username=‘susan‘,role=user_role)

>>>user_david = User(username=‘david‘,role=user_role)

現在這些對象只存在於Python 中,還未寫入資料庫。因此 id 尚未賦值。

>>>print(admin_role.id)

None

>>>print(mod_role.id)

None

>>>print(user_role.id)

None

通過資料庫會話管理對資料庫所做的改動,在 Flask-SQLAlchemy 中,會話由 db.session表示。準備把對象寫入資料庫之前,先要將其添加到會話中。

>>>db.session.add(admin_role)

>>>db.session.add(mod_role)

>>>db.session.add(user_role)

>>>db.session.add(user_kevin)

>>>db.session.add(user_susan)

>>>db.session.add(user_david)

可以簡寫為:

>>>db.session.add_all([admin_role,mod_role,user_role,user_kevin,user_susan,user_david])

為了把對象寫入資料庫,要調用 commit() 方法提交會話。

>>>db.session.commit()

再次查看id屬性,它們已經賦值了,表裡也有資料了。

>>>print(admin_role.id)

1

>>>print(mod_role.id)

2

>>>print(user_role.id)

3

mysql> select * from roles;

+----+-----------+

| id | name      |

+----+-----------+

|  1 | Admin    |

|  2 | Moderator |

|  3 | User     |

+----+-----------+

3 rows in set (0.00sec)

 

mysql> select * from users;

+----+----------+----------+---------+

| id | username |password | role_id |

+----+----------+----------+---------+

|  1 | kevin   | NULL     |       1 |

|  2 | susan   | NULL     |       3 |

|  3 | david   | NULL     |       3 |

+----+----------+----------+---------+

3 rows in set (0.00sec)

5.3、修改資料

在資料庫會話上調用 add() 方法也能更新模型。下面把 "Admin" 角色重新命名為 "Administrator"。

>>>admin_role.name = ‘Adminitrator‘

>>>db.session.add(admin_role)

>>>db.session.commit()

>>>print(admin_role.name)

Adminitrator

5.4、刪除資料

資料庫會話還有個 delete() 方法。下面是把 "Moderator" 角色從資料庫中刪除。

>>>db.session.delete(mod_role)

>>>db.session.commit()

mysql> select name from roles where name=‘Moderator‘;

Empty set (0.00sec)

5.5、查詢資料

Flask-SQLAlchemy 為每個模型類都提供了query 對象。最基本的模型查詢是取回對應表中的所有記錄。

>>>Role.query.all()

[<Roleu‘Adminitrator‘>, <Role u‘User‘>]

>>>User.query.all()

[<Useru‘kevin‘>, <User u‘susan‘>, <User u‘david‘>]

使用過濾器可以配置 query 對象進行更精確的資料庫查詢。下面這個例子尋找角色為"User" 的所有使用者

>>>User.query.filter_by(role=user_role).all()

[<Useru‘susan‘>, <User u‘david‘>]

filter_by() 等過濾器在 query 對象上調用,返回一個更精確的 query 對象。多個過濾器可以一起調用,直到獲得所需結果。完整的列表參見 SQLAlchemy 文檔。

 


由於個人技術所限有不足之處還請各位指出。可以通過以下兩個群找到筆者。

北京linux營運求職招聘群:153677549

Linux營運開發群:298324302


本文出自 “長街聽風人” 部落格,請務必保留此出處http://kevinhao.blog.51cto.com/5204735/1883759

使用Flask-SQLALchemy操作MySQL資料庫

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.