2016-11-20 34 views
1

我不能在MySQL中使用Flask_SQLAlchemy來存儲瑞典語字符:(我試圖找到一個星期的解決方案,現在我真的需要幫助,因爲它感覺我已經到了死衚衕了,我想它可能是某種東西我試圖用Flask,Flask_SQLAlchemy和MySQL(5.5.3)來構建一個網站,如果這是無法解決的,我正在考慮將Flask_SQLAlchemy改爲其他的東西。 (我已經參加了一門編程課程(Python),其餘的都是自我思考,所以如果你的答案能儘可能詳細,非常感謝任何建議!)Flask_SQLAlchemy,MySQL,存儲瑞典字符å,ä,ö?

(competeEnv) C:\>conda list 
# packages in environment at C:\Users\MyName\Anaconda3.1\envs\competeEnv: 
# 
click      6.6      py27_0 
flask      0.11.1     py27_0 
Flask-SQLAlchemy   2.1      <pip> 
itsdangerous    0.24      py27_0 
jinja2     2.8      py27_1 
markupsafe    0.23      py27_2 
mysql-python    1.2.5     py27_0 
pip      9.0.1     py27_0 
python     2.7.12      0 
setuptools    27.2.0     py27_1 
sqlalchemy    1.1.4     py27_0 
vs2008_runtime   9.00.30729.1     2 
werkzeug     0.11.11     py27_0 
wheel      0.29.0     py27_0 
(competeEnv) C:\> 

以下是testAlchemy.py中的代碼文件

from flask import Flask 
from flask_sqlalchemy import SQLAlchemy 

app=Flask(__name__) 
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:[email protected]/firstdb' 
app.config['SQLALCHEMY_ECHO'] = False 
app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=True 
app.config['MYSQL_DATABASE_CHARSET'] = 'utf8mb4' 
db = SQLAlchemy(app) 


class Users(db.Model): 
    __tablename__='users' 
    id=db.Column('iduser', db.Integer, primary_key=True) 
    name=db.Column('column_name', db.String(193)) 

    def __init__(self, name): 
     self.name=name 

    def __repr__(self): 
     return self.name 

db.create_all() 
db.session.commit() 

president1=Users('Obama') 
president2=Users('Trump') 
db.session.add(president1) 
db.session.add(president2) 
db.session.commit() 

這裏應該有一些線索..

(competeEnv) C:\Users\MyName\Anaconda3.1\envs>python 
Python 2.7.12 |Continuum Analytics, Inc.| (default, Jun 29 2016, 11:07:13)[MSC v.1500 64 bit (AMD64)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
Anaconda is brought to you by Continuum Analytics. 
Please check out: http://continuum.io/thanks and https://anaconda.org 
>>> from testAlchemy import Users, db 
>>> db.session.add(Users('Federer')) 
>>> db.session.commit() 
>>> Users.query.all() 
[Obama, Trump, Federer] 
>>> db.session.add(Users('ä')) 
>>> db.session.commit() 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
File "C:\Users\MyName\Anaconda3.1\envs\competeEnv\lib\site-packages\sqlalchemy\orm\scoping.py", line 157, in do 
return getattr(self.registry(), name)(*args, **kwargs) 
File "C:\Users\MyName\Anaconda3.1\envs\competeEnv\lib\site-packages\sqlalchemy\orm\session.py", line 801, in commit 
self.transaction.commit() 
File "C:\Users\MyName\Anaconda3.1\envs\competeEnv\lib\site-packages\sqlalchemy\orm\session.py", line 392, in commit 
self._prepare_impl() 
File "C:\Users\MyName\Anaconda3.1\envs\competeEnv\lib\site-packages\sqlalchemy\orm\session.py", line 372, in _prepare_impl 
self.session.flush() 
File "C:\Users\MyName\Anaconda3.1\envs\competeEnv\lib\site-packages\sqlalchemy\orm\session.py", line 2019, in flush 
self._flush(objects) 
File "C:\Users\MyName\Anaconda3.1\envs\competeEnv\lib\site-packages\sqlalchemy\orm\session.py", line 2137, in _flush 
transaction.rollback(_capture_exception=True) 
File "C:\Users\MyName\Anaconda3.1\envs\competeEnv\lib\site-packages\sqlalchemy\util\langhelpers.py", line 60, in __exit__ 
compat.reraise(exc_type, exc_value, exc_tb) 
File "C:\Users\MyName\Anaconda3.1\envs\competeEnv\lib\site-packages\sqlalchemy\orm\session.py", line 2101, in _flush 
flush_context.execute() 
File "C:\Users\MyName\Anaconda3.1\envs\competeEnv\lib\site-packages\sqlalchemy\orm\unitofwork.py", line 373, in execute 
rec.execute(self) 
File "C:\Users\MyName\Anaconda3.1\envs\competeEnv\lib\site-packages\sqlalchemy\orm\unitofwork.py", line 532, in execute 
uow 
File "C:\Users\MyName\Anaconda3.1\envs\competeEnv\lib\site-packages\sqlalchemy\orm\persistence.py", line 174, in save_obj 
mapper, table, insert) 
File "C:\Users\MyName\Anaconda3.1\envs\competeEnv\lib\site-packages\sqlalchemy\orm\persistence.py", line 800, in _emit_insert_statements 
execute(statement, params) 
File "C:\Users\MyName\Anaconda3.1\envs\competeEnv\lib\site-packages\sqlalchemy\engine\base.py", line 914, in execute 
return meth(self, multiparams, params) 
File "C:\Users\MyName\Anaconda3.1\envs\competeEnv\lib\site-packages\sqlalchemy\sql\elements.py", line 323, in _execute_on_connection 
return connection._execute_clauseelement(self, multiparams, params) 
File "C:\Users\MyName\Anaconda3.1\envs\competeEnv\lib\site-packages\sqlalchemy\engine\base.py", line 1010, in _execute_clauseelement 
compiled_sql, distilled_params 
File "C:\Users\MyName\Anaconda3.1\envs\competeEnv\lib\site-packages\sqlalchemy\engine\base.py", line 1146, in _execute_context 
context) 
File "C:\Users\MyName\Anaconda3.1\envs\competeEnv\lib\site-packages\sqlalchemy\engine\base.py", line 1341, in _handle_dbapi_exception 
exc_info 
File "C:\Users\MyName\Anaconda3.1\envs\competeEnv\lib\site-packages\sqlalchemy\util\compat.py", line 202, in raise_from_cause 
reraise(type(exception), exception, tb=exc_tb, cause=cause) 
File "C:\Users\MyName\Anaconda3.1\envs\competeEnv\lib\site-packages\sqlalchemy\engine\base.py", line 1139, in _execute_context 
context) 
File "C:\Users\MyName\Anaconda3.1\envs\competeEnv\lib\site-packages\sqlalchemy\engine\default.py", line 450, in do_execute 
cursor.execute(statement, parameters) 
File "C:\Users\MyName\Anaconda3.1\envs\competeEnv\lib\site-packages\MySQLdb\cursors.py", line 205, in execute 
self.errorhandler(self, exc, value) 
File "C:\Users\MyName\Anaconda3.1\envs\competeEnv\lib\site-packages\MySQLdb\connections.py", line 36, in defaulterrorhandler 
raise errorclass, errorvalue 
sqlalchemy.exc.OperationalError: (_mysql_exceptions.OperationalError) (1366, "Incorrect string value: '\\x84' for column 'column_name' at row 1") [SQL: u'INSERT INTO users (column_name) VALUES (%s)'] [parameters: ('\x84',)] 
>>> 

回答

2

由於您使用Python 2.7,你需要指定你的字符串包含Unicode。

>>> db.session.add(Users(u'ä')) 

您還可以使用未來的導入將所有字符串視爲unicode。

from __future__ import unicode_literals 

或者,您可以升級您的Python版本。 2.7是將字符串視爲字節而不是unicode的最後一個版本。

編輯

您還需要更新您的__repr__,使其正確處理Unicode。

def __repr__(self): 
    return self.name.decode('utf-8') 

或任何您想使用的編碼。

一般來說,您需要確保處理編碼和解碼爲unicode。我不能敦促你考慮使用更新版本的Python。 Python 3中最大的變化之一解決了這個問題。

+0

它工作將它添加到數據庫!令人驚歎的,謝謝。但是,當我試圖檢索它似乎有一個相關的問題.. >>> db.session.add(用戶(u'ä')) >>> db.session.commit() >>>用戶.query.all() [奧巴馬,特朗普,奧巴馬,特朗普,新,追蹤(最近呼籲最後): 文件「」,第1行,在 UnicodeEncodeError:'ascii'編解碼器無法編碼字符'\ xe4'在位置0:序號不在範圍內(128) – cek11lru

+0

我已經更新瞭解決此問題的答案。 – dirn

+0

謝謝!你似乎是對的..但我會誠實的,因爲它仍然是一個問題。 >>> Users.query.all() [奧巴馬,特朗普,新的,新的,Traceback(最近呼叫最後): 文件「」,第1行,在 文件「C:\ Users \ MyName \ Anaconda3 .1 \ envs \ envNew \ testAlchemy.py「,第22行,在__repr__ return self.name.decode('utf-8') 文件」C:\ Users \ MyName \ Anaconda3.1 \ envs \ envNew \ lib \ encodings \ utf_8.py「,第16行,解碼爲 返回編解碼器。utf_8_decode(input,errors,True) UnicodeEncodeError:'ascii'編解碼器無法編碼字符u'\ xe4'在位置0:序號不在範圍內(128) – cek11lru

相關問題