SQLAlchemy Database Connection Operation for Getting Started with Flask (Lesson 15) [Transfer]

Reprinted from: http://www.cnblogs.com/wongbingming/p/6831448.html

 

1. Library installation

Flask-SQLAlchemy    2
SQLAlchemy    1.0.8

2. Enter venv

3. Switch to the project Sample\  folder and enter the shell of manager.py

python manager.py shell

Fourth, create a data.sqlite database

from app import db
from app import models
db.create_all()

  After executing the last command, a data.sqlite file will be generated under Sample\app

 

5. Import the database in Pycharm for easy visualization

  Data Source -> Sqlite(Xerial)

  

  Then do the following

  

  After clicking OK, you will find that the import has been successful.

  

 

6. Manipulate data in shell mode

  1. Increment (write data)

copy code
>>> from app import db
>>> from app import models
>>> from app.models import User,Role
>>> admins = Role(name='administrators')
>>> mod = Role(name='moderator')
>>> db.session.add(admins)
>>> db.session.add(mod)
>>> db.session.commit()

#或者两条一起添加
#db.session.add([admins,mod])
copy code

 

  注意,对数据库增删改查,都必须进行commit()方法才能写入数据库。

  现在来查看下,到底有没有写入?双击roles表,看到了我们写入的两行记录

 

  2. 删(删除数据)

copy code
# 说明一下:表的每行记录都是一个对象
# 例如上面:admins和mod都是对象,name是其属性

>>> admins.name
u'administrators'

# 为什么说明这点,因为删除行就是删除对象

>>> db.session.delete(admins)
>>> db.session.commit()

# 删除成功
copy code

  3.改(修改数据)  

# 通过对属性重新赋值,添加,提交事务进行修改数据

mod.name='moderators-new'
db.session.add(mod)
db.session.commit()

 

 

  4. 查(查询数据)

copy code
# query返回的是包含所有记录的查询对象(BaseQuery)
>>> Role.query
<flask_sqlalchemy.BaseQuery object at 0x0000000004936E10>

# query之后如果需要对记录进行条件筛选,要加上过滤函数,返回过滤后的查询对象(BaseQuery),可以多次执行过滤函数
>>> Role.query.filter_by(name='admins')
<flask_sqlalchemy.BaseQuery object at 0x0000000004A2C438>

# 过滤函数之后,加执行函数,返回是记录对象(如果是多行怎么办),赋值为一个对象名Admin
>>> Role.query.filter_by(name='administrators').first()
<app.models.Role object at 0x0000000004A13F98>

#Admin对象的属性,就相当于单元格的值
>>> Admin = Role.query.filter_by(name='administrators').first()
>>> Admin.name
u'administrators'
copy code

 

 

  5. 表之间的关联

还记得我们之前定义models.py中的Role和User类时,那个relationship吗,关键是参数backref

先来看看我们Role表中的对象admins,name=administrator,id为3

我们知道这个Role表中的id和User表中的role_id(外键)是对应连接的。

那我们在往User表写入数据的时候,还要写入对应的role_id,有个一步到位的方法,就是把Role行的对象作为参数传给定义类时backref的值(这里是role)

他就会自动获取id,并传给role_id

  执行代码

>>> Bikmin = User(name='Bikmin',roles=admins)
>>> db.session.add(Bikmin)
>>> db.session.commit()

  看看效果,role_id为3,对应上了

 

 

  这里说一下,query()和get()的区别

1. query() 返回所有记录的查询对象

2. get() 使用的主键查询

  示例

>>> Role.query.get(2).name
u'moderator'

 

返回的是moderator,和id一样

 

   要讲SQLAlchemy查询语句转成原生的SQL语句,只需用str()即可

str(Role.query.filter_by(name='administrators').all())

 

  

   If the Python object of the line is created when the shell session is used for the first time, then after closing the shell and opening it again, these objects can no longer be used and must be re-created

admins = Role.query.filter_by(name='administrators').first()

 

 

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=326133334&siteId=291194637