基于Flask的简单博客项目创建(数据库操作)

在配置好全局变量后,把模板(template)复制粘贴到模板目录下,那么MVC中的V(view)我们已经弄好了,现在着手的是M和C。

M:

在我上个随笔(http://www.cnblogs.com/hachimei/p/6636654.html)中的全局变量设置中,有个User类,我们仿照它在自己数据库中建立相应的表。

然后,是数据库的增删查改了,这里我使用SQLAlchemy来操作数据库,具体代码可参考下面:(很不要脸的复制粘贴)

from sqlalchemy import func, or_, not_

user = User(name='a')
session.add(user)
user = User(name='b')
session.add(user)
user = User(name='a')
session.add(user)
user = User()
session.add(user)
session.commit()
query = session.query(User)
print query # 显示SQL 语句
print query.statement # 同上
for user in query: # 遍历时查询
    print user.name
print query.all() # 返回的是一个类似列表的对象
print query.first().name # 记录不存在时,first() 会返回 None
# print query.one().name # 不存在,或有多行记录时会抛出异常
print query.filter(User.id == 2).first().name
print query.get(2).name # 以主键获取,等效于上句
print query.filter('id = 2').first().name # 支持字符串
query2 = session.query(User.name)
print query2.all() # 每行是个元组
print query2.limit(1).all() # 最多返回 1 条记录
print query2.offset(1).all() # 从第 2 条记录开始返回
print query2.order_by(User.name).all()
print query2.order_by('name').all()
print query2.order_by(User.name.desc()).all()
print query2.order_by('name desc').all()
print session.query(User.id).order_by(User.name.desc(), User.id).all()
print query2.filter(User.id == 1).scalar() # 如果有记录,返回第一条记录的第一个元素
print session.query('id').select_from(User).filter('id = 1').scalar()
print query2.filter(User.id > 1, User.name != 'a').scalar() # and
query3 = query2.filter(User.id > 1) # 多次拼接的 filter 也是 and
query3 = query3.filter(User.name != 'a')
print query3.scalar()
print query2.filter(or_(User.id == 1, User.id == 2)).all() # or
print query2.filter(User.id.in_((1, 2))).all() # in
query4 = session.query(User.id)
print query4.filter(User.name == None).scalar()
print query4.filter('name is null').scalar()
print query4.filter(not_(User.name == None)).all() # not
print query4.filter(User.name != None).all()
print query4.count()
print session.query(func.count('*')).select_from(User).scalar()
print session.query(func.count('1')).select_from(User).scalar()
print session.query(func.count(User.id)).scalar()
print session.query(func.count('*')).filter(User.id > 0).scalar() # filter() 中包含 User,因此不需要指定表
print session.query(func.count('*')).filter(User.name == 'a').limit(1).scalar() == 1 # 可以用 limit() 限制 count() 的返回数
print session.query(func.sum(User.id)).scalar()
print session.query(func.now()).scalar() # func 后可以跟任意函数名,只要该数据库支持
print session.query(func.current_timestamp()).scalar()
print session.query(func.md5(User.name)).filter(User.id == 1).scalar()
query.filter(User.id == 1).update({User.name: 'c'})
user = query.get(1)
print user.name
user.name = 'd'
session.flush() # 写数据库,但并不提交
print query.get(1).name
session.delete(user)
session.flush()
print query.get(1)
session.rollback()
print query.get(1).name
query.filter(User.id == 1).delete()
session.commit()
print query.get(1)

在这个项目中,我的数据库操作代码如下:

#获取表的全部title列和text列 
sess = DBSession()
    rs = sess.query(User.title, User.text).all()
    entries = [dict(title=row[0], text=row[1]) for row in rs]
    sess.close()

#插入一条数据

sess = DBSession()
    new_user = User(title=request.form['title'], text=request.form['text'])
    sess.add(new_user)
    sess.commit()
    sess.close()

好了,接下来才是正题,在我插入数据时出现了warning,我有一句mmp一定要讲

F:\python\untitled\venv\lib\site-packages\pymysql\cursors.py:167: Warning: (1366, "Incorrect string value: '\\xD6\\xD0\\xB9\\xFA\\xB1\\xEA...' for column 'VARIABLE_VALUE' at row 479")
  result = self._query(query)

百度n次,问了n人,DEBUG也救不了,我都深入到mysql底层的_read_bytes(),都奈何不了,简直逼死处女座,还好我不是,不过老是这么warning,看着也难受,就把他屏蔽了吧

点击错误路径,进入cursors.py:167 

result = self._query(query)
进入_query(),找到
if not self._defer_warnings:
self._show_warnings()
把这两个小妖精删掉,整个世界都清静了

posted on 2017-03-28 20:51  axiba  阅读(2120)  评论(1编辑  收藏  举报

导航