[英]SQLAlchemy automap backref error
我对SQLAlchemy自动映射和覆盖名称有很大的疑问。 参见下面的代码:
from sqlalchemy import create_engine, text
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.ext.automap import automap_base
import re
import inflect
import warnings
from sqlalchemy import inspect
#name overriding
def name_for_scalar_relationship(base, local_cls, referred_cls, constraint):
name = referred_cls.__name__.lower()
local_table = local_cls.__table__
if name in local_table.columns:
newname = name + "_"
warnings.warn(
"Already detected name %s present. using %s" %
(name, newname))
return newname
return name
def camelize_classname(base, tablename, table):
"Produce a 'camelized' class name, e.g. "
"'words_and_underscores' -> 'WordsAndUnderscores'"
return str(tablename[0].upper() + \
re.sub(r'_([a-z])', lambda m: m.group(1).upper(), tablename[1:]))
_pluralizer = inflect.engine()
def pluralize_collection(base, local_cls, referred_cls, constraint):
"Produce an 'uncamelized', 'pluralized' class name, e.g. "
"'SomeTerm' -> 'some_terms'"
referred_name = referred_cls.__name__
uncamelized = re.sub(r'[A-Z]',
lambda m: "_%s" % m.group(0).lower(),
referred_name)[1:]
pluralized = _pluralizer.plural(uncamelized)
return pluralized
engine = create_engine(
"mysql+pymysql://blablabla@blabla/blabla", convert_unicode=True)
db_session = scoped_session(sessionmaker(autocommit=False,
autoflush=False,
bind=engine))
#Mapping
Base = automap_base()
Base.prepare(engine, reflect=True, name_for_scalar_relationship = name_for_scalar_relationship, classname_for_table=camelize_classname, name_for_collection_relationship=pluralize_collection)
我使用了文档建议的所有替代功能,但仍然出现此错误:
sqlalchemy.exc.ArgumentError: Error creating backref 'order_supplier_rows' on relationship 'OrderSupplierRow.detail': property of that name exists on mapper 'Mapper|Detail|detail'
问题与之前的文章相同: sqlalchemy在关系上创建backref时出错
除非我无法更改数据库定义以重命名backrefs 。 否则,这将是最后的解决方案,如果其他任何方法都无法正常工作...如果这些backref名称在自动映射过程中已经存在多次,我想覆盖它们。
我已经尝试修复了几个小时! 提前致谢 !
似乎我通过重写backrefs命名解决了这个问题:
def _gen_relationship(base, direction, return_fn,
attrname, local_cls, referred_cls, **kw):
return generate_relationship(base, direction, return_fn,
attrname+'_ref', local_cls, referred_cls, **kw)
打电话之前
Base.prepare(engine, reflect=True, generate_relationship=_gen_relationship)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.