Flask搭配SQLAlchemy配置
首先安装 SQLAlchemy
很多人用 Flask-SQLAlchemy插件 ,这个教程并不涉及。
使用 pip 安装(没安装pip的需要要先安装pip)
pip install SQLAlchemy
安装完毕后检查一下是否安装成功
>>> import sqlalchemy
>>> sqlalchemy.__version__
1.1.0
安装 MySQL 的驱动
安装驱动
这个选择很多,根据文档 列出来的有:
- MySQL-Python
- PyMySQL
- MySQL Connector/Python
- CyMySQL
- OurSQL
- Google Cloud SQL
- PyODBC
- zxjdbc for Jython
我们这里使用 MySQL 官方提供的 MySQL Connector/Python。
pip install mysql-connector-python --allow-external mysql-connector-python
使用 —allow-external 来使 pip 从外部获取包。
测试驱动
1,打开Mysql
2,进去Python命令行模式
# import驱动:
>>> import mysql.connector
# 替换下面命令中的账号、密码和数据库名字:
>>> conn = mysql.connector.connect(user='root', password='password', database='yourdatabase')
>>> cursor = conn.cursor()
# 创建user表:
>>> cursor.execute('create table user (id varchar(20) primary key, name varchar(20))')
# 插入一行记录,注意MySQL的占位符是%s:
>>> cursor.execute('insert into user (id, name) values (%s, %s)', ['1', 'Micheal'])
>>> cursor.rowcount
1
# 提交事务:
>>> conn.commit()
>>> cursor.close()
# 运行查询:
>>> cursor = conn.cursor()
>>> cursor.execute('select * from user where id = %s', ('1',))
>>> values = cursor.fetchall()
>>> values
[('1', 'Michael')]
# 关闭Cursor和Connection:
>>> cursor.close()
True
>>> conn.close()
编写代码,整合 FLask、MySQL和SQLAlchemy
目录结构
├── app.py
├── database.py
├── main.py
├── models.py
├── static
└── templates
main.py
from flask import jsonify
from flask import render_template
from flask import Flask, session, redirect, url_for, escape, request
import models
import database
from app import app
@app.route('/add/<name>/<email>')
def add(name, email):
u = models.User(name=name, email=email)
try:
database.db_session.add(u)
database.db_session.commit()
except Exception as e:
return 'wrong'
return 'Add %s user successfully' % name
if __name__ == '__main__':
database.init_db()
app.debug = True
app.run()
models.py
from sqlalchemy import Column, Integer, String
from database import Base
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(50), unique=True)
email = Column(String(120), unique=True)
def __init__(self, name=None, email=None):
self.name = name
self.email = email
def __repr__(self):
return '%s (%r, %r)' % (self.__class__.__name__, self.name, self.email)
database.py
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from app import app
# 替换 root, password, databasename 为你自己的)
engine = create_engine("mysql+mysqlconnector://root:password@localhost:3306/databasename?charset=utf8")
db_session = scoped_session(sessionmaker(autocommit=False,
autoflush=False,
bind=engine))
Base = declarative_base()
Base.query = db_session.query_property()
def init_db():
# 在这里导入所有的可能与定义模型有关的模块,这样他们才会合适地
# 在 metadata 中注册。否则,您将不得不在第一次执行 init_db() 时
# 先导入他们。
import models
Base.metadata.create_all(bind=engine)
app.py
from flask import Flask
app = Flask(__name__, instance_relative_config=True)
# 读取./instance/config.py的代码
app.config.from_pyfile('config.py')
#app.config.from_envvar('APP_CONFIG_FILE')
运行
最后运行代码,访问localhost:5000/add/abc/edf,出现一行字successfully,就算成功了。
参考: