欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
sqlalchemy中文問(wèn)題解決方案

  sqlalchemy是python下一個(gè)很強大的ORM,最近剛剛開(kāi)始使用。當然由于只是剛剛接觸,只學(xué)習使用了他的DB API,對于Mapper還有些不得要領(lǐng)。
  最近寫(xiě)的一個(gè)程序,用到MySql數據庫,有些數據庫讀寫(xiě)的操作,對sqlalchemy已經(jīng)有了些了解,自然要練練,更何況它能大幅度的提高程序開(kāi)發(fā)的效率。于是就驅動(dòng)sqlalchemy,用它開(kāi)始了第一個(gè)數據庫應用程序的編寫(xiě)。
  代碼說(shuō)話(huà):


#coding=utf-8
from sqlalchemy import *
connstr = 'mysql://uid:pwd@localhost/mydb'
db = create_engine(connstr, echo=True)
metadata = MetaData(db) 
table = Table('mytable', metadata, autoload=True)
i = table.insert()
i.execute(c1='value')
 
  我通過(guò)上面的代碼連接連接到數據庫,打開(kāi)表并執行插入數據的操作。執行程序,檢查結果,ok,沒(méi)有問(wèn)題,心里一陣暗爽。
  但當我把這段代碼加入到程序中時(shí),問(wèn)題出來(lái)了,所有插入的中文全部是亂碼,囧。按照常規思路,比較簡(jiǎn)單的做法是對中文進(jìn)行編碼轉化.我的數據庫表使用的是utf-8編碼,于是寫(xiě)了這樣的代碼:
'中文'.decode('gbk').encode('utf8'),
結果依然是亂碼。
  在google上搜索發(fā)現,也有人遇到了類(lèi)似的問(wèn)題(大家都是中國人嘛:)),有兩篇文章提出了解決方案,其中一個(gè)方法是在create_engine時(shí)增加兩個(gè)參數,即:
create_engine(connstr, encoding='utf8', convert_unicode=True),
試了一下,無(wú)效。另一篇《MySql+SQLAlchemy+wxPython的Unicode解決方案》中提到修改MYSQLdb的connection.py文件的set_character_set方法,直接設為utf-8編碼,我試了一下,的確可以了。但...這樣似乎太暴力了一點(diǎn),于是我決定找到原因。
  根據上文中的思路發(fā)現,由于向set_character_set傳遞的charset參數為空,所以,該函數自動(dòng)設置采用默認的編碼連接mysql,也就是latin-1。因為sqlalchemy沒(méi)有向該MYSQLdb傳遞charset,所以也就出現了上文作者郁悶的情況:總是latin-1。而前一篇文章里提到的方法和這個(gè)根本不沾邊。
  調試發(fā)現,create_engine調用了strategies.py的DefaultEngineStrategy類(lèi)連接數據庫的,該類(lèi)的create方法里有個(gè)cparams變量,這個(gè)變量保存的是從連接url解析出來(lái)的數據庫連接參數,比如host、username、pwssword這些。閱讀MYSQLdb的代碼知道,它是通過(guò)charset參數指定連接的編碼的,于是修改了這個(gè)變量增加了charset參數(cparams.update({'charset':'utf8'})),居然也可以正常保存中文了。突破口就在這里,看來(lái)應該在這個(gè)url上做點(diǎn)文章了。
  繼續閱讀代碼,在database下的mysql這個(gè)模塊中,發(fā)現了這么一段注釋?zhuān)?/div>

Many MySQL server installations default to a ``latin1`` encoding for client connections.  All data sent through the connection will be converted into ``latin1``, even if you have ``utf8`` or another character set on your tables and columns.  With versions 4.1 and higher, you can change the connection character set either through server configuration or by passing the  ``charset`` parameter to  ``create_engine``.  The ``charset`` option is passed through to MySQL-Python and has the side-effect of also enabling ``use_unicode`` in the driver by default.  For regular encoded strings, also pass ``use_unicode=0`` in the connection arguments.

  這也證明了上面切入點(diǎn)是正確的。在create_engine的注釋中找到了url的定義:

The URL is a string in the form ``dialect://user:password@host/dbname[?key=value..]``, where ``dialect`` is a name such as ``mysql``, ``oracle``, ``postgres``, etc.  Alternatively, the URL can be an instance of ``sqlalchemy.engine.url.URL``.

  很明白了,這個(gè)URL居然還支持"QueryString",于是把connstr修改為
connstr = 'mysql://uid:pwd@localhost/mydb?charset=utf8'
,在看了這么多廢話(huà)以后:),如你所愿,漢字正確的保存到里數據庫里,O(∩_∩)O哈哈~。
  真是郁悶,這么重要的用法,在文檔里怎么沒(méi)有描述呢?還是我沒(méi)有找到?在google group里有很多人都遇到了utf8編碼的問(wèn)題,但似乎都沒(méi)有正解。所以我把排除問(wèn)題的全過(guò)程寫(xiě)下來(lái),歡迎交流。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久