我正在研究一个涉及多种货币会计的小型项目。在开发过程中,我决定使用alembic从简单的DB设置转移到DB-migrations。而在一些迁移中,我需要用初始货币填充数据库,这些数据以乌克兰语显示。在alembic迁移中插入Unicode值
我的问题是从alembic迁移脚本填充的数据正在保存在一些未知的编码中,所以我不能在应用程序内使用它(这期望是人类可读的)。是我的设置以及脚本如下:
alembic.ini
...
sqlalchemy.url = mysql+pymysql://defaultuser:[email protected]/petdb
...
蒸馏器/版本/ f433ab2a814_adding_currency.py
from alembic import op
# -*- coding: utf-8 -*-
"""Adding currency
Revision ID: f433ab2a814
Revises: 49538bba2220
Create Date: 2016-03-08 13:50:35.369021
"""
# revision identifiers, used by Alembic.
revision = 'f433ab2a814'
down_revision = '1c0b47263c82'
branch_labels = None
depends_on = None
def upgrade():
op.create_table(
'currency',
Column('id', Integer, primary_key=True),
Column('name', Unicode(120), nullable=False),
Column('abbr', String(3), nullable=False)
)
op.execute(u'INSERT INTO currency SET name="{}", abbr="{}";'.format(u"Гривня", "UAH"))
从MySQL的检查表currency
后客户端或mysql-workbench,它显示为:
mysql> SELECT * FROM currency;
+----+----------------------------+------+
| id | name | abbr |
+----+----------------------------+------+
| 1 | Ð“Ñ€Ð¸Ð²Ð½Ñ | UAH |
+----+----------------------------+------+
预期的结果是:
mysql> SELECT * FROM currency;
+----+----------------------------+------+
| id | name | abbr |
+----+----------------------------+------+
| 1 | Гривня | UAH |
+----+----------------------------+------+
从我的申请,我如下已设置该值:
from petproject import app
app.config.from_object(config.DevelopmentConfig)
engine = create_engine(app.config["DATABASE"]+"?charset=utf8",
convert_unicode=True, encoding="utf8", echo=False)
db_session = scoped_session(sessionmaker(autocommit=False,
autoflush=False,
bind=engine))
if len(db_session.query(Currency).all()) == 0:
default_currency = Currency()
default_currency.name = u"Гривня"
default_currency.abbr = u"UAH"
db_session.add(default_currency)
db_session.commit()
所以我不知道如何在初始插入Unicode值迁移将以正确的编码进行存储。我错过了什么吗?
你设置[整理](https://dev.mysql.com/doc/refman/5.7/en /charset-syntax.html)(在服务器,数据库,表或列上)转换为UTF-8归类? – univerio
是的。 mysql> SHOW CREATE TABLE currency; |表|创建表 + ---------- + ----------------------------------- ---------------------- + |货币| CREATE TABLE'currency'( 'id' int(11)NOT NULL AUTO_INCREMENT, 'name' varchar(120)COLLATE utf8_unicode_ci NOT NULL, 'abbr' varchar(3)COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY ') )ENGINE = InnoDB AUTO_INCREMENT = 4 DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci | – wanderlust