flask web 编程学习笔记4:SQL


Flask 支持多种数据库,并采用sqlalchemy 作为常用ORM,链接数据库也比较方便。
1. 复制执行下述代码,即可实现数据库的链接。
2. 用编辑器打开数据库文件,可以看到自己添加的数据内容。

  1. ''' 
  2.     Note4. SQL Database And Example 
  3. '''  
  4. #  
  5. #########################################################################  
  6. #  
  7. #     数据库按照一定规则保存程序数据,程序再发起查询取回所需  
  8. # 的数据。Web 程序最常用基于关系模型的数据库,这种数据库也称  
  9. # 为SQL 数据库,因为它们使用结构化查询语言。不过最近几年文档  
  10. # 数据库和键值对数据库成了流行的替代选择,这两种数据库合称  
  11. # NoSQL数据库。  
  12.   
  13. #########################################################################  
  14. #  
  15. # 1) Flask 可用MySQL、Postgres、SQLite、Redis、MongoDB或者CouchDB。  
  16. #    SQLAlchemy ORM 作为一个数据库工具,常被用于项目。  
  17. #  
  18. # 2) SQLAlchemy安装: pip install flask-sqlalchemy.  
  19. #  
  20. # 3) SQLAlchemy支持以下数据库,方法如下:  
  21. # |----------------------------------------------------------------------  
  22. # | 数据库            | 引擎URL  
  23. # |----------------------------------------------------------------------  
  24. # | MySQL             | mysql://username:password@hostname/database  
  25. # | Postgres          | postgresql://username:password@hostname/database  
  26. # | SQLite(Unix)    | sqlite:////absolute/path/to/database  
  27. # | SQLite(Windows) | sqlite:///c:/absolute/path/to/database  
  28. # |----------------------------------------------------------------------  
  29.   
  30. # 以下按照sqlite3 进行说明。  
  31. #  
  32. from flask import Flask,render_template, session, redirect, url_for  
  33. from flask.ext.sqlalchemy import SQLAlchemy  
  34. from flask.ext.bootstrap import Bootstrap  
  35. from flask.ext.wtf import Form  
  36. from wtforms import StringField, SubmitField  
  37. from wtforms.validators import Required  
  38. import os  
  39.   
  40. # 得到项目路径的常用方法。  
  41. basedir = os.path.abspath(os.path.dirname(__file__))  
  42.   
  43. # Flask 实例化  
  44. app = Flask(__name__)  
  45. # 定义app数据库文件及路径。  
  46. app.config['SQLALCHEMY_DATABASE_URI'] =\  
  47. 'sqlite:///' + os.path.join(basedir, 'data.sqlite')  
  48. # SQLALCHEMY_COMMIT_ON_TEARDOWN配置。  
  49. app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True  
  50. #  
  51. app.config['SECRET_KEY'] = 'hard to guess string'  
  52. # db 对象是SQLAlchemy 类的实例,表示程序使用的数据库,同时还获得了  
  53. # Flask-SQLAlchemy提供的所有功能。  
  54. db = SQLAlchemy(app)  
  55. #  
  56. bootstrap = Bootstrap(app)  
  57. #  
  58. #     采用类继承的方式定义新的数据库表格,类变量__tablename__ 定义在  
  59. # 数据库中使用的表名。Column函数定义表中元素,其参数特点如下:  
  60. #     db.Column(类型,其他参数,....)  
  61. #  
  62. # 1) 类型表.  
  63. # |-------------------------------------------------------------------------  
  64. # | 类型名       | Python类型          | 说  明  
  65. # |-------------------------------------------------------------------------  
  66. # | Integer      | int                 | 普通整数,一般是32 位  
  67. # | SmallInteger | int                 | 取值范围小的整数,一般是16 位  
  68. # | BigInteger   | int 或long          | 不限制精度的整数  
  69. # | Float        | float               | 浮点数  
  70. # | Numeric      | decimal.Decimal     | 定点数  
  71. # | String       | str                 | 变长字符串  
  72. # | Text         | str                 | 变长字符串,对较长或不限长度的字符串  
  73. # |------------------------------------| 做了优化  
  74. # | Unicode      | unicode             | 变长Unicode 字符串  
  75. # | UnicodeText  | unicode             | 变长Unicode 字符串,对较长或不限长度  
  76. # |------------------------------------| 的字符串做了优化  
  77. # | Boolean      | bool                | 布尔值  
  78. # | Date         | datetime.date       | 日期  
  79. # | Time         | datetime.time       | 时间  
  80. # | DateTime     | datetime.datetime   | 日期和时间  
  81. # | Interval     | datetime.timedelta  | 时间间隔  
  82. # | Enum         | str                 | 一组字符串  
  83. # | PickleType   | 任何Python          | 对象自动使用Pickle 序列化  
  84. # | LargeBinary  | str                 | 二进制文件  
  85. # |---------------------------------------------------------------------------  
  86. #  
  87. # 2) 其他属性表  
  88. # |---------------------------------------------------------------------------  
  89. # | 选项名      | 说  明  
  90. # |---------------------------------------------------------------------------  
  91. # | primary_key | 如果设为True,这列就是表的主键  
  92. # | unique      | 如果设为True,这列不允许出现重复的值  
  93. # | index       | 如果设为True,为这列创建索引,提升查询效率  
  94. # | nullable    | 如果设为True,这列允许使用空值;如果设为False,这列不允许使用  
  95. # |-------------| 空值  
  96. # | default     | 为这列定义默认值  
  97. # |---------------------------------------------------------------------------  
  98. #  
  99. class Role(db.Model):  
  100.     __tablename__ = 'roles'  
  101.     id = db.Column(db.Integer, primary_key=True)  
  102.     name = db.Column(db.String(64), unique=True)  
  103.     #     db.relationship() 中的backref 参数向User 模型中添加一个role 属性,  
  104.     # 从而定义反向关系。这一属性可替代role_id 访问Role 模型,此时获取的是模  
  105.     # 型对象,而不是外键的值。  
  106.     users = db.relationship('User', backref='role')  
  107.     def __repr__(self):  
  108.         return '' % self.name  
  109.           
  110. class User(db.Model):  
  111.     __tablename__ = 'users'  
  112.     id = db.Column(db.Integer, primary_key=True)  
  113.     username = db.Column(db.String(64), unique=Trueindex=True)  
  114.     #     关系使用users 表中的外键连接了两行。添加到User 模型中的role_id 列  
  115.     # 被定义为外键,就是这个外键建立起了关系。传给db.ForeignKey() 的参数  
  116.     # 'roles.id' 表明,这列的值是roles 表中行的id 值。  
  117.     role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))  
  118.     def __repr__(self):  
  119.         return '' % self.username  
  120.   
  121. class NameForm(Form):  
  122.     name = StringField('What is your name?', validators=[Required()])  
  123.     submit = SubmitField('Submit')  
  124.       
  125. @app.route('/', methods=['GET', 'POST'])  
  126. def index():  
  127.     form = NameForm()  
  128.     if form.validate_on_submit():  
  129.         user = User.query.filter_by(username=form.name.data).first()  
  130.         if user is None:  
  131.             user = User(username = form.name.data)  
  132.             db.session.add(user)  
  133.             session['known'] = False  
  134.         else:  
  135.             session['known'] = True  
  136.         session['name'] = form.name.data  
  137.         form.name.data = ''  
  138.         return redirect(url_for('index'))  
  139.     return render_template('sql.html',\  
  140.                            form = form, name = session.get('name'),\  
  141.                            known = session.get('known', False))  
  142. if __name__ == '__main__':  
  143.     db.create_all()  
  144.     app.run(debug=True)  

版权所有丨如未注明,均为原创,转载请注明转自:https://whonee.net/flask-web-%e7%bc%96%e7%a8%8b%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b04%ef%bc%9asql.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注