1. 程式人生 > >Flask之SQLAlchemy操作mysql

Flask之SQLAlchemy操作mysql

這裡我們來學習下python操作mysql。以下環境都是在Ubuntu 18.04當中。

flask使用SQLAlchemy來操作mysql。

安裝

首先我們要安裝mysql-python

pip install mysql-python

如果出現如下錯誤:

sh: 1: mysql_config: not found
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-install-GOmOTT/mysql-python/setup.py"
, line 17, in <module> metadata, options = get_config() File "setup_posix.py", line 43, in get_config libs = mysql_config("libs_r") File "setup_posix.py", line 25, in mysql_config raise EnvironmentError("%s not found" % (mysql_config.path,)) EnvironmentError: mysql_config not
found

則需要安裝libmysqlclient-dev

sudo apt-get install libmysqlclient-dev

然後我們再安裝SQLAlchemy:

pip install flask-sqlalchemy

這樣後我們就可以用python來操作mysql 了。

基本操作

我們來個最簡單的基本操作:

# 檔名test.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SECRET_KEY'
] = 'hardtoguessstring' app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://user:[email protected]:3306/testdb' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True db = SQLAlchemy(app) class Role(db.Model): __tablename__ = 'roles' # 資料庫表名,如果不指定,則會生成預設的,最好指定 id = db.Column(db.Integer, nullable=False, primary_key=True, autoincrement=True) name = db.Column(db.String(16), nullable=False, server_default='', unique=True) def __repr__(self): return '<Role %r>' % self.name class User(db.Model): __tablename__ = 'users' id = db.Column(db.Integer, nullable=False, primary_key=True, autoincrement=True) username = db.Column(db.String(32), nullable=False, unique=True, server_default='', index=True) role_id = db.Column(db.Integer, nullable=False, server_default='0') def __repr__(self): return '<User %r,Role id %r>' %(self.username,self.role_id)

然後我們手動在資料庫中建立一個testdb的資料庫,再執行這個檔案即可看到testdb中生成了roles,users表。

一、連線資料庫

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://user:[email protected]:port/dbname'

二、建立所有表

python
>>> from hello import db,Role,User
>>> db.create_all()

三、刪除所有表

python
>>> from hello import db,Role,User
>>> db.drop_all()

四、插入行

# 插入單行
python
>>> from hello import db,Role,User
>>> db.session.add(Role(name='Admin'))
>>> db.session.commit()
>>> db.session.add(Role(name='Moderator'))
>>> db.session.add(Role(name='User'))
>>> db.session.commit()

# 插入多行
python
>>> from hello import db,Role,User
>>> db.session.add_all([User(username='john',role_id=1),User(username='susan',role_id=3),User(username='david',role_id=3)])
>>> db.session.commit()

五、更新行

python
>>> from hello import db,Role,User
>>> admin = Role.query.filter_by(name='Admin').first()
>>> admin.name='Administrator'
>>> db.session.commit()

六、刪除行

python hello.py shell
>>> from hello import db,Role,User
>>> mod = Role.query.filter_by(name='Moderator').first()
>>> db.session.delete(mod)
>>> db.session.commit()

七、查詢表

  • 查詢表中全部資料

    
    # 注意,此處的查詢結果完全取決於程式碼示例中的
    
    
    # def __repr__(self)
    
    
    # 這段函式,請各位同學注意
    
    python
    >>> from hello import db,Role,User
    >>> Role.query.all()
    [<Role u'Administrator'>, <Role u'User'>]
    >>> User.query.all()
    [<User u'john',Role id 1L>, <User u'susan',Role id 3L>, <User u'david',Role id 3L>]
    
  • 按照一個條件過濾資料記錄(where)

    python
    >>> from hello import db,Role,User
    >>> Role.query.filter_by(name='Administrator').first()
    <Role u'Administrator'>
    >>> User.query.filter_by(role_id=3).all()
    [<User u'susan',Role id 3L>, <User u'david',Role id 3L>]
    >>> User.query.filter_by(role_id=3).first()
    <User u'susan',Role id 3L>
    
  • 按照兩個條件過濾資料記錄(where and)

    python
    >>> from hello import db,Role,User
    >>> User.query.filter_by(role_id=3,username='susan').first()
    <User u'susan',Role id 3L>
    >>> User.query.filter_by(role_id=3,username='susan').all()
    [<User u'susan',Role id 3L>]
    
  • 聚合(count)

    python hello.py shell
    >>> from hello import db,Role,User
    >>> User.query.filter_by(role_id=3,username='susan').count()
    1L
    >>> User.query.filter_by(role_id=3).count()
    2L
    >>> User.query.count()
    3L
    
  • 求和(sum)

    python hello.py shell
    >>> from hello import db,Role,User
    >>> from sqlalchemy.sql import func
    >>> User.query.with_entities(func.sum(User.id)).all()
    [(Decimal('6'),)]
    >>> User.query.with_entities(func.sum(User.role_id)).all()
    [(Decimal('7'),)]
    
  • 平均數(avg)

    python
    >>> from hello import db,Role,User
    >>> from sqlalchemy.sql import func
    >>> User.query.with_entities(func.avg(User.role_id)).all()
    [(Decimal('2.3333'),)]
    >>> User.query.with_entities(func.avg(User.id)).all()
    [(Decimal('2.0000'),)]
    
  • 排序(order by)

    python
    >>> from hello import db,Role,User
    
    # 升序(asc)
    
    >>> User.query.order_by(User.role_id).all()
    [<User u'john',Role id 1L>, <User u'susan',Role id 3L>, <User u'david',Role id 3L>]
    
    # 降序(desc)
    
    >>> User.query.order_by(User.role_id.desc()).all()
    [<User u'susan',Role id 3L>, <User u'david',Role id 3L>, <User u'john',Role id 1L>]
    
  • 分組(group by)

    python hello.py shell
    >>> from hello import db,Role,User
    >>> User.query.group_by(User.role_id).all()
    [<User u'john',Role id 1L>, <User u'susan',Role id 3L>]
    
  • 限制(limit)

    python
    >>> from hello import db,Role,User
    >>> User.query.all()
    [<User u'john',Role id 1L>, <User u'susan',Role id 3L>, <User u'david',Role id 3L>]
    
    # limit 1
    
    >>> User.query.limit(1).all()
    [<User u'john',Role id 1L>]
    
    # limit 2,1
    
    >>> User.query.limit(1).offset(2).all()
    [<User u'david',Role id 3L>]
    >>> User.query.filter_by(role_id=3).all()
    [<User u'susan',Role id 3L>, <User u'david',Role id 3L>]
    
    # limit 1
    
    >>> User.query.filter_by(role_id=3).limit(1).all()
    [<User u'susan',Role id 3L>]
    
    # limit 1,1
    
    >>> User.query.filter_by(role_id=3).limit(1).offset(1).all()
    [<User u'david',Role id 3L>]
    

整合到專案中

實際情況中我們不可能在一個檔案中寫上n多個數據表類,肯定都是分開的,這樣就有了Role.py、User.py這樣的類出現,然而你發現建立他們需要db這個物件,而上面的程式碼中SQLAlchemy建立時候需要傳入的初始化的app,這就矛盾了。

事實是SQLAlchemy建立時候可以不傳入app,初始化時候再傳入app進行賦值初始化即可。

所以正常步驟如下:

  • 1、首先在foundation.py中初始化一個db = SQLAlchemy()這樣是為了整個專案中只有這一個資料庫物件。

  • 2、在資料庫表物件中引入這個db,整合db.Model,生成資料表物件。

  • 3、在初始化專案時候,引入這個db,然後初始化app,並建立資料庫表。

    db.app = app
    db.init_app(app)
    db.create_all()

資料庫的建立操作只需要執行一次即可,所以這裡我們再使用另外的一個庫來操作資料庫的初始化,這裡使用Flask-Script來進行一些簡單的操作。

Flask-Script 是一個 Flask 擴充套件,為 Flask 程式添加了一個命令列解析器。Flask-Script 自帶了一組常用選項,而且還支援自定義命令。

我們經常用Flask-Script來執行一些在flask之外的程式碼,比如開發時候,我需要建立一個測試的資料庫,或者清空資料庫,或者我可以根據實際情況來啟動開發版還是正式版。

我們來看一個簡單的例子:

from flask_script import Manager
from flask import Flask
app = Flask(__name__)

manager = Manager(app)

@manager.command
def createall():
    db.create_all()
    db.session.commit()

上面這個例子中,creatall這個函式被加了@manager.command語句,這樣我即可以在python中直接執行該方法:

python app.py creatall

執行如上語句後,資料庫中的表即可被建立,這樣就不用每次我們在app初始化後去都去建立資料庫表了。
flask-script還有很多用處,感興趣的同學可以自行去學習下。

相關推薦

FlaskSQLAlchemy操作mysql

這裡我們來學習下python操作mysql。以下環境都是在Ubuntu 18.04當中。 flask使用SQLAlchemy來操作mysql。 安裝 首先我們要安裝mysql-python pip install mysql-python

使用SQLAlchemy操作MYSQL黑科技 屬性訂制

relation check kref sql 黑科技 ack ada generate user 1 class Role(UserMixin, db.Model): 2 __tablename__ = ‘Role‘ 3 id = db.Colum

python3使用flask-sqlalchemy操作mysql

   由於 MySQL-python 不支援 Python 3(MySQL-3.23 through 5.5 and Python-2.4 through 2.7 are currently supported),python3下使用flask-sqlalchemy時,安裝的

通過sqlalchemy操作mysql

Coding user abc base ati 實例 對象 metadata maker # 安裝 pip3 install sqlalchemy import sqlalchemyfrom sqlalchemy import create_enginefrom sqla

Python學習==>操作MySQL

lis 練習 font 多條 print color ID 建立 pass 一、簡介:   MySQL為關系型數據庫,其他關系型數據庫包括Oracle、DB2、Sql Server等等。Python操作MySQL需要使用到pymsyql模塊,pip安裝即可。 二、操作MyS

flask 通過SQLAlchemy 連線MYSQL樣例

 #coding:utf-8 #SQLAlchemy 是一個 Python 包,其最底層包裝了對資料庫進入操作的統一介面,然後在最上層提供了物件關係對映(ORM)的實現。 from flask_sqlalchemy import SQLAlchemy #引入Flask類

PythonMysqlSQLAlchemy操作總結

pla values 兩個 調用 聯合 判斷 null 替換 python3 一、Mysql命令總結 1.創建庫 create database test1; 2.授權一個用戶 grant all privileges on *.* to ‘feng‘@‘%‘ identi

三十四、python學Flask框架(六)資料庫:mysql資料庫及Flask-SQLAlchemy

一、資料庫知識回顧: 1.SQL:關係型資料庫,支援結構化查詢語言: 關係型資料庫:以表的形式儲存; 支援結構化查詢語言:SQL語句; 列數固定;行數可變,定義資料,主鍵、外來鍵,引用同表或不同表的主鍵,這種聯絡稱為關係. 2.關於正規化: 第一

Python學習總結筆記(10)-- MySQL資料庫操作SQLAlchemy使用總結

SQLAlchemy是一個著名的ORM框架,使用ORM操作資料庫,不用去關注SQL語句本身,這樣可以提高開發的效率。同時使用ORM框架雖然可以減少程式碼編寫的消耗,但是可能也會執行很多冗餘的資料庫操作,降低程式的執行效率。不過總的來說,合理利用ORM框架與資料庫

Flask入門SQLAlchemy配置與數據庫連接

數據 rdo nsh imp log kref mod pre file 1. 安裝SQLAlchemy pip install flask-sqlalchemy 2. 導入和配置 from flask_sqlalchemy import SQLAlchemy bas

python 操作mysql數據庫模擬購物系統登錄及購物

定義 普通用戶 [0 elif 選擇 oat value 退出程序 查看 python 操作mysql數據庫之模擬購物系統登錄及購物,功能包含普通用戶、管理員登錄,查看商品、購買商品、添加商品,用戶充值等。 mysql 數據庫shop 表結構創建如下: cr

flask + pymysql操作Mysql數據庫

ext efault 自動提交 ble ring mat 3-9 ret conf 安裝flask-sqlalchemy、pymysql模塊 pip install flask-sqlalchemy pymysql 安裝Mysql數據庫 from flask.e

python 操作mysql 數據庫實例

不能 insert rom har list limit 生效 commit 連接 對於python操作mysql 數據庫,具體的步驟應為: 1. 連接上mysql host 端口號 數據庫 賬號 密碼2. 建立遊標3. 執行sql(註意,如果是update,insert,

MySQL 操作

存儲 ren pri 了解 8bit 最小 dex tinc htm 一 什麽是表   表(TABLE) 是一種結構化的文件,可用來存儲某種特定類型的數據。表中的一條記錄有對應的標題,標題 稱之為 表的字段。    二 創建表 1 2 3 4 5

MySQL 操作

create subst light 密碼 replicat isp 文件中 dmi cati 一 系統數據庫 二 數據庫操作 三 命名規範 四 用戶權限 五.修改密碼 六 忘記密碼 七 中文亂碼問題 一.系統數據庫 information_schema :

MySQL操作

代碼 set 不能 show 啟動 gpo 一個 信息 sql數據庫 一、庫的簡介 information_schema: 虛擬庫,不占用磁盤空間,存儲的是數據庫啟動後的一些參數,如用戶表信息、列信息、權限信息、字符信息等 performance_schema: M

MySQL操作

條件 def auto efault nod primary 以及 type 字段名 一、創建表   1、創建新表 #語法: create table 表名( 字段名1 類型[(寬度) 約束條件], 字段名2 類型[(寬度) 約束條件], 字段名3 類型[(

Go基礎--操作Mysql(二)

有時 ans ror score 事件 tab 自動 還需要 以及 在上一篇文章中主要整理了Golang連接mysql以及一些基本的操作,並進行了大概介紹,這篇文章對增刪查改進行詳細的整理 讀取數據 在上一篇文章中整理查詢數據的時候,使用了Query的方法查詢,其實d

pymysql和sqlalchemy模塊操作mysql數據庫

stat not null 訪問 ons rst rim 作用 roo llb 這兩個模塊可以直接通過pip安裝: 打開mysql創建幾個表: CREATE TABLE `student_age`( `id` int not null, `age` int

python操作mysql(一)

mod 它的 utf8 連接數 mode char PE class 是個 使用python操作mysql的思路: 1. 連接數據庫:ip,端口號,密碼,賬號,數據庫 2. 建立遊標 3.執行sql語句 4.獲取執行結果 5.關閉遊標,關閉連接 conn = pymysql