SQLAlchemy автоматически преобразует str в unicode при коммите - PullRequest
4 голосов
/ 14 июня 2010

При вставке объекта в базу данных с помощью SQLAlchemy все его свойства, соответствующие столбцам String (), автоматически преобразуются изв,Есть ли способ предотвратить такое поведение?

Вот код:

from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData
from sqlalchemy.orm import mapper, sessionmaker

engine = create_engine('sqlite:///:memory:', echo=False)
metadata = MetaData()

table = Table('projects', metadata,
    Column('id', Integer, primary_key=True),
    Column('name', String(50))
)

class Project(object):
    def __init__(self, name):
        self.name = name

mapper(Project, table)
metadata.create_all(engine)

session = sessionmaker(bind=engine)()

project = Project("Lorem ipsum")

print(type(project.name))

session.add(project)
session.commit()

print(type(project.name))

А вот и вывод:

<type 'str'>
<type 'unicode'>

Я знаю, что, наверное, простоработать с юникодом, но это потребует копания стороннего кода, и у меня пока нет навыков Python:)

Ответы [ 2 ]

12 голосов
/ 14 июня 2010

На самом деле, есть способ сделать это.Просто выполните эту строку кода после создания engine:

engine.raw_connection (). Connection.text_factory = str

6 голосов
/ 14 июня 2010

К сожалению, вам не повезло, и это, похоже, не работает с sqlite.Цитата из SQLAlchemy 0.6.2 Документация - SQLite - Unicode :

В отличие от активной обработки SQLAlchemy типов даты и времени для pysqlite, поведение pysqlite по умолчанию в отношении Unicode заключается в том, что всеСтроки возвращаются как объекты Python Unicode во всех случаях.Таким образом, даже если тип Unicode не используется, вы все равно всегда будете получать данные Unicode обратно из набора результатов.Настоятельно рекомендуется использовать тип Unicode для представления строк, поскольку он выдаст предупреждение, если из пользовательского приложения будет передана строка Python, отличная от Unicode.Смешивание использования не-Unicode-объектов с возвращенными Unicode-объектами может быстро создать путаницу, особенно при использовании ORM, поскольку внутренние данные не всегда представлены фактической строкой результата базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...