Closed sqlalchemy-bot closed 6 years ago
Michael Bayer (zzzeek) wrote:
the error I get with both mysqlclient and pymysql is:
#!python
(1366, u"Incorrect string value: '\\xE5\\x90\\xAF\\xE5\\x8A\\xA8' for column 'name' at row 1") [SQL: u'INSERT INTO actiontype (pkey, name, description, suite_only) VALUES (%(pkey)s, %(name)s, %(description)s, %(suite_only)s)'] [parameters: ({'pkey': 'launch', 'suite_only': 0, 'description': u'\u542f\u52a8\u88ab\u6d4b\u8bd5App', 'name': u'\u542f\u52a8'}, {'pkey': 'record', 'suite_only': 0, 'description': u'\u5f00\u59cb\u5f55\u5236\u5c4f\u5e55', 'name': u'\u5f55\u5c4f'})]
however if I create the table with the correct character set, it works fine:
#!python
actiontype = op.create_table(
'actiontype',
sa.Column('id', sa.Integer(), primary_key=True),
sa.Column('pkey', sa.String(16)),
sa.Column('name', sa.String(16)),
sa.Column('description', sa.Text()),
sa.Column('suite_only', sa.Boolean(), default=False),
mysql_charset="utf8"
)
output:
#!sql
CREATE TABLE actiontype (
id INTEGER NOT NULL AUTO_INCREMENT,
pkey VARCHAR(16),
name VARCHAR(16),
description TEXT,
suite_only BOOL,
PRIMARY KEY (id),
CHECK (suite_only IN (0, 1))
)CHARSET=utf8
INFO [sqlalchemy.engine.base.Engine] {}
INFO [sqlalchemy.engine.base.Engine] COMMIT
INFO [sqlalchemy.engine.base.Engine] INSERT INTO actiontype (pkey, name, description, suite_only) VALUES (%(pkey)s, %(name)s, %(description)s, %(suite_only)s)
INFO [sqlalchemy.engine.base.Engine] ({'pkey': 'launch', 'suite_only': 0, 'name': u'\u542f\u52a8', 'description': u'\u542f\u52a8\u88ab\u6d4b\u8bd5App'}, {'pkey': 'record', 'suite_only': 0, 'name': u'\u5f55\u5c4f', 'description': u'\u5f00\u59cb\u5f55\u5236\u5c4f\u5e55'})
INFO [sqlalchemy.engine.base.Engine] COMMIT
INFO [sqlalchemy.engine.base.Engine] INSERT INTO alembic_version (version_num) VALUES ('ff52eaa4094a')
INFO [sqlalchemy.engine.base.Engine] {}
INFO [sqlalchemy.engine.base.Engine] COMMIT
try that, and also please specify:
#!python
#!coding: utf-8
thanks!
Handsome2734 (Handsome2734) wrote:
coding
is set to utf-8 in initial_version.py.Stack trace:
INFO [alembic.runtime.migration] Context impl MySQLImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
INFO [alembic.runtime.migration] Running upgrade -> dc1891381ab4, initial version
Traceback (most recent call last):
File "c:\python27\Lib\runpy.py", line 174, in _run_module_as_main
"__main__", fname, loader, pkg_name)
File "c:\python27\Lib\runpy.py", line 72, in _run_code
exec code in run_globals
File "E:\iqiyi\lab\.env\Scripts\alembic.exe\__main__.py", line 9, in <module>
File "e:\iqiyi\lab\.env\lib\site-packages\alembic\config.py", line 486, in main
CommandLine(prog=prog).main(argv=argv)
File "e:\iqiyi\lab\.env\lib\site-packages\alembic\config.py", line 480, in main
self.run_cmd(cfg, options)
File "e:\iqiyi\lab\.env\lib\site-packages\alembic\config.py", line 463, in run_cmd
**dict((k, getattr(options, k, None)) for k in kwarg)
File "e:\iqiyi\lab\.env\lib\site-packages\alembic\command.py", line 254, in upgrade
script.run_env()
File "e:\iqiyi\lab\.env\lib\site-packages\alembic\script\base.py", line 427, in run_env
util.load_python_file(self.dir, 'env.py')
File "e:\iqiyi\lab\.env\lib\site-packages\alembic\util\pyfiles.py", line 81, in load_python_file
module = load_module_py(module_id, path)
File "e:\iqiyi\lab\.env\lib\site-packages\alembic\util\compat.py", line 141, in load_module_py
mod = imp.load_source(module_id, path, fp)
File "migrations\env.py", line 70, in <module>
run_migrations_online()
File "migrations\env.py", line 65, in run_migrations_online
context.run_migrations()
File "<string>", line 8, in run_migrations
File "e:\iqiyi\lab\.env\lib\site-packages\alembic\runtime\environment.py", line 836, in run_migrations
self.get_context().run_migrations(**kw)
File "e:\iqiyi\lab\.env\lib\site-packages\alembic\runtime\migration.py", line 330, in run_migrations
step.migration_fn(**kw)
File "E:\iqiyi\lab\migrations\versions\dc1891381ab4_initial_version.py", line 131, in upgrade
'description': u'寮€濮嬪綍鍒跺睆骞?
File "<string>", line 8, in bulk_insert
File "<string>", line 3, in bulk_insert
File "e:\iqiyi\lab\.env\lib\site-packages\alembic\operations\ops.py", line 1780, in bulk_insert
operations.invoke(op)
File "e:\iqiyi\lab\.env\lib\site-packages\alembic\operations\base.py", line 319, in invoke
return fn(self, operation)
File "e:\iqiyi\lab\.env\lib\site-packages\alembic\operations\toimpl.py", line 154, in bulk_insert
operation.table, operation.rows, multiinsert=operation.multiinsert)
File "e:\iqiyi\lab\.env\lib\site-packages\alembic\ddl\impl.py", line 232, in bulk_insert
self._exec(table.insert(inline=True), multiparams=rows)
File "e:\iqiyi\lab\.env\lib\site-packages\alembic\ddl\impl.py", line 118, in _exec
return conn.execute(construct, *multiparams, **params)
File "e:\iqiyi\lab\.env\lib\site-packages\sqlalchemy\engine\base.py", line 948, in execute
return meth(self, multiparams, params)
File "e:\iqiyi\lab\.env\lib\site-packages\sqlalchemy\sql\elements.py", line 269, in _execute_on_connection
return connection._execute_clauseelement(self, multiparams, params)
File "e:\iqiyi\lab\.env\lib\site-packages\sqlalchemy\engine\base.py", line 1060, in _execute_clauseelement
compiled_sql, distilled_params
File "e:\iqiyi\lab\.env\lib\site-packages\sqlalchemy\engine\base.py", line 1200, in _execute_context
context)
File "e:\iqiyi\lab\.env\lib\site-packages\sqlalchemy\engine\base.py", line 1416, in _handle_dbapi_exception
util.reraise(*exc_info)
File "e:\iqiyi\lab\.env\lib\site-packages\sqlalchemy\engine\base.py", line 1170, in _execute_context
context)
File "e:\iqiyi\lab\.env\lib\site-packages\sqlalchemy\dialects\mysql\mysqldb.py", line 105, in do_executemany
rowcount = cursor.executemany(statement, parameters)
File "e:\iqiyi\lab\.env\lib\site-packages\MySQLdb\cursors.py", line 281, in executemany
self._get_db().encoding)
File "e:\iqiyi\lab\.env\lib\site-packages\MySQLdb\cursors.py", line 297, in _do_execute_many
v = values % escape(next(args), conn)
File "e:\iqiyi\lab\.env\lib\site-packages\MySQLdb\cursors.py", line 110, in _escape_args
args = tuple(map(ensure_bytes, args))
File "e:\iqiyi\lab\.env\lib\site-packages\MySQLdb\cursors.py", line 100, in _ensure_bytes
x = x.encode(encoding)
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-1: ordinal not in range(256)
I tried adding ?charset=utf8
after sqlalchemy.url
in alembic.ini
, and it seemed to solve the problem.
Michael Bayer (zzzeek) wrote:
I tried adding ?charset=utf8 after sqlalchemy.url in alembic.ini, and it seemed to solve the problem.
oh, yes you need that too, I thought that was what you meant when you said "However the MySQL in alembic.ini is utf-8 encoding.". Yeah that's all it is you need to have that set up see http://docs.sqlalchemy.org/en/latest/dialects/mysql.html#charset-selection
Migrated issue, originally created by Handsome2734 (Handsome2734)
This migration throws error
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-1: ordinal not in range(256)
when executingalembic upgrade head
. However the MySQL in alembic.ini is utf-8 encoding.