基於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()
把這兩個小妖精刪掉,整個世界都清靜了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM