#sql #sqlalchemy #plone
#sql #sqlalchemy #plone
Вопрос:
У меня есть экземпляр сборки с pas.plugins.sqlalchemy. Это отображается в списке установки, но при установке это приводит к ошибке.
Вот определение ZCML:
<configure xmlns="http://namespaces.zope.org/zope" xmlns:db="http://namespaces.zope.org/db">
<include package="z3c.saconfig" file="meta.zcml" />
<db:engine xmlns="http://namespaces.zope.org/db" name="pas" url="mysql://webadmin:password@rcs-mysql-dev/estep" />
<db:session xmlns="http://namespaces.zope.org/db" name="pas.plugins.sqlalchemy" engine="pas" />
</configure>
Обратная трассировка — это:
Traceback (innermost last):
Module ZPublisher.Publish, line 127, in publish
Module ZPublisher.mapply, line 77, in mapply
Module ZPublisher.Publish, line 47, in call_object
Module Products.CMFQuickInstallerTool.QuickInstallerTool, line 575, in installProducts
Module Products.CMFQuickInstallerTool.QuickInstallerTool, line 512, in installProduct
- __traceback_info__: ('pas.plugins.sqlalchemy',)
Module Products.GenericSetup.tool, line 330, in runAllImportStepsFromProfile
- __traceback_info__: profile-pas.plugins.sqlalchemy:install
Module Products.GenericSetup.tool, line 1085, in _runImportStepsFromContext
Module Products.GenericSetup.tool, line 999, in _doRunImportStep
- __traceback_info__: pas.plugins.sqlalchemy.install
Module pas.plugins.sqlalchemy.setuphandlers, line 46, in install
Module sqlalchemy.schema, line 2148, in create_all
Module sqlalchemy.engine.base, line 1698, in create
Module sqlalchemy.engine.base, line 1740, in _run_visitor
Module sqlalchemy.sql.visitors, line 83, in traverse_single
Module sqlalchemy.engine.ddl, line 42, in visit_metadata
Module sqlalchemy.sql.visitors, line 83, in traverse_single
Module sqlalchemy.engine.ddl, line 58, in visit_table
Module sqlalchemy.engine.base, line 1191, in execute
Module sqlalchemy.engine.base, line 1241, in _execute_ddl
Module sqlalchemy.sql.expression, line 1413, in compile
Module sqlalchemy.engine.base, line 702, in compile
Module sqlalchemy.engine.base, line 715, in process
Module sqlalchemy.sql.visitors, line 54, in _compiler_dispatch
Module sqlalchemy.sql.compiler, line 1152, in visit_create_table
Module sqlalchemy.dialects.mysql.base, line 1282, in get_column_specification
Module sqlalchemy.engine.base, line 761, in process
Module sqlalchemy.sql.visitors, line 54, in _compiler_dispatch
Module sqlalchemy.sql.compiler, line 1450, in visit_string
Module sqlalchemy.dialects.mysql.base, line 1520, in visit_VARCHAR
InvalidRequestError: VARCHAR requires a length when rendered on MySQL
Комментарии:
1. Посмотрите на строку над диагностикой: «Модуль sqlalchemy.dialects.mysql.base, строка 1520, в visit_VARCHAR». Действительно ли «visit_VARCHAR» является юридическим именем какого-либо компонента? Или где-то во входном файле скрывается опечатка?
Ответ №1:
вам нужно указать длины для всех строк. Это означает: String(n) вместо просто String . Итак, в pas.plugins.sqlalchemy.model.User
login = Column(String, unique=True)
становится
login = Column(String(100), unique=True)
и т.д…
Комментарии:
1. Это, очевидно, верно, но webbyfox не в состоянии это исправить. Это ошибка в pas.plugins. sqlalchemy
2. Что ж, это очень вежливо с вашей стороны. Я только что исправил пакет для вас, и вы принимаете чей-то ответ. Это не устраняет ошибку, потому что при следующем выпуске новой версии пакета она перезапишет ваши изменения.
Ответ №2:
У меня нет установки MySQL и pas.plugins.для меня sqlalchemy отлично работает в postgresql, но, похоже, авторы сделали предположение о varchars. Предполагая, что это не то, с чем SQLAlchemy должен справляться сам (было бы действительно неплохо, если бы диалект MySQL для SQLAlchemy выбирал подходящий максимальный размер для неограниченных переменных), я посмотрю, смогу ли я зафиксировать исправление этим вечером.
Беглый взгляд на код показывает, что все поля «String» (обрабатываемые базой данных как varchar) имеют максимальную длину, за исключением полей Login, name и password в таблице User и name в таблице Group, и нет веских причин, по которым они должны отличаться.
Обновление: проверьте https://svn.plone.org/svn/collective/PASPlugins/pas.plugins.sqlalchemy/branches/auspex из subversion. Это моя версия pas.plugins.sqlalchemy с поддержкой интерфейса IGroupCapability (позволяет добавлять пользователей в группы, которые также хранятся в rdb, и удалять их из них), и я также добавил длины ко всем неограниченным строковым полям.
Если вы не знаете, как использовать извлечения subversion в buildout, смотрите: http://pypi.python.org/pypi/mr.developer /
Комментарии:
1. Оки, я также посмотрю на код. Присылайте мне любые предложения, которые у вас есть
2. Я сделал в соответствии с тем, что результат тот же. Я не уверен, что мой экземпляр использует вашу последнюю версию плагина или нет, поскольку у меня старая версия все еще находится в папке buildout-cache eggs. вот моя сборка.cfg pastie.org/1766909 . Нужно ли мне что-либо обновлять в конфигурации сборки, чтобы указать на новую версию плагина. Большое спасибо за ваше время и помощь
3. Как я уже сказал — вам нужно получить ее из subversion. Он и близко не готов к выпуску. Не стесняйтесь обращаться ко мне напрямую за помощью с mr.developer
4. Спасибо за это, просто интересно, были ли предложенные вами изменения приняты моим экземпляром или нет. поскольку я все еще вижу там свою старую копию, хотя в папке src на корневом уровне сайта есть новая копия.
5. Что ж, ваш пирог выглядит правильно. Запустите ваш экземпляр в режиме «debug» (bin/instance debug), импортируйте pas.plugins. sqlalchemy и проверьте его
__path__
атрибут, если вы не считаете, что получаете правильную версию