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還有很多用處,感興趣的同學可以自行去學習下。
相關推薦
Flask之SQLAlchemy操作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類
Python之Mysql及SQLAlchemy操作總結
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