3

従来のMSSQLデータベースにSQLalchemyを実装するのに多くの問題があります。これは既存の大きなデータベースであるため、データベースを反映するためにautoloadを使用すると時間がかかりすぎるため、 sqlautocodeを使用してファイルを生成したいと思いました。

最初の問題は、sqlautocodeがSQLalchemy0.8で機能しなくなったことです。以前のバージョンからの既存の出力がまだ残っていたので、テストするためだけにそれを使用すると思いました。

これで、sqlautocodeは「従来のマッピング」を出力します。これは実際には問題ではありませんが、外部キーを使用しようとすると常に'RelationshipProperty' object has no attribute 'c'表示されます。SQLalchemyライブラリの奥深くにあるエラー。

そこで次に、sqlautocodeをスキップして、クラスとリレーションを自分で記述し、SQLalchemy0.8のこのコードを使用してみました。2つのサンプルテーブルを使用しましたが、まったく同じエラーが発生しました。次に、ほとんどの列、すべてのリレーションをコメントアウトすると、エラーが発生します。

以下は私のコードです:

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, ForeignKey
from sqlalchemy.orm import relationship, backref
from sqlalchemy.dialects.mssql import *

Base = declarative_base()


class PeopleMemberhip(Base):
    __tablename__ = 'people_memberships'

    ppl_mshp_id = Column(VARCHAR(length=36), primary_key=True, nullable=False)
    ppl_mshp_startdate = Column(DATETIME())
    ppl_mshp_enddate = Column(DATETIME())
    # ppl_mshp_pmsd_id = Column(VARCHAR(length=36), ForeignKey('paymentschedules.pmsd_id'))

    # paymentschedule = relationship("PaymentSchedule", backref=backref('people_memberships'))

    def __repr__(self):
        return "<people_membership('%s','%s')>" % (self.ppl_mshp_id, self.ppl_mshp_startdate)


class PaymentSchedule(Base):
    __tablename__ = 'paymentschedules'

    pmsd_id = Column(VARCHAR(length=36), primary_key=True, nullable=False)
    pmsd_name = Column(NVARCHAR(length=60))
    pmsd_startdate = Column(DATETIME())
    pmsd_enddate = Column(DATETIME())

    # paymentschedule = relationship("PaymentSchedule", backref=backref('people_memberships'))

    def __repr__(self):
        return "<paymentschedule('%s','%s')>" % (self.pmsd_id, self.pmsd_name)

そして結果として生じるエラー:

Traceback (most recent call last):
  File "C:\Program Files (x86)\JetBrains\PyCharm 2.7\helpers\pydev\pydevd.py", line 1472, in <module>
    debugger.run(setup['file'], None, None)
  File "C:\Program Files (x86)\JetBrains\PyCharm 2.7\helpers\pydev\pydevd.py", line 1116, in run
    pydev_imports.execfile(file, globals, locals) #execute the script
  File "C:/Users/erik/workspace/flasktest/test.py", line 16, in <module>
    contract = db.session.query(PeopleMemberhip).filter_by(ppl_mshp_id='98ABD7E9-4CFF-4F7B-8537-8E46FD5C79D5').one()
  File "C:\Users\erik\workspace\flasktest\lib\site-packages\sqlalchemy\orm\scoping.py", line 149, in do
    return getattr(self.registry(), name)(*args, **kwargs)
  File "C:\Users\erik\workspace\flasktest\lib\site-packages\sqlalchemy\orm\session.py", line 1105, in query
    return self._query_cls(entities, self, **kwargs)
  File "C:\Users\erik\workspace\flasktest\lib\site-packages\sqlalchemy\orm\query.py", line 115, in __init__
    self._set_entities(entities)
  File "C:\Users\erik\workspace\flasktest\lib\site-packages\sqlalchemy\orm\query.py", line 124, in _set_entities
    self._set_entity_selectables(self._entities)
  File "C:\Users\erik\workspace\flasktest\lib\site-packages\sqlalchemy\orm\query.py", line 157, in _set_entity_selectables
    ent.setup_entity(*d[entity])
  File "C:\Users\erik\workspace\flasktest\lib\site-packages\sqlalchemy\orm\query.py", line 2744, in setup_entity
    self._with_polymorphic = ext_info.with_polymorphic_mappers
  File "C:\Users\erik\workspace\flasktest\lib\site-packages\sqlalchemy\util\langhelpers.py", line 582, in __get__
    obj.__dict__[self.__name__] = result = self.fget(obj)
  File "C:\Users\erik\workspace\flasktest\lib\site-packages\sqlalchemy\orm\mapper.py", line 1425, in _with_polymorphic_mappers
    configure_mappers()
  File "C:\Users\erik\workspace\flasktest\lib\site-packages\sqlalchemy\orm\mapper.py", line 2106, in configure_mappers
    mapper._post_configure_properties()
  File "C:\Users\erik\workspace\flasktest\lib\site-packages\sqlalchemy\orm\mapper.py", line 1242, in _post_configure_properties
    prop.init()
  File "C:\Users\erik\workspace\flasktest\lib\site-packages\sqlalchemy\orm\interfaces.py", line 231, in init
    self.do_init()
  File "C:\Users\erik\workspace\flasktest\lib\site-packages\sqlalchemy\orm\properties.py", line 1028, in do_init
    self._setup_join_conditions()
  File "C:\Users\erik\workspace\flasktest\lib\site-packages\sqlalchemy\orm\properties.py", line 1102, in _setup_join_conditions
    can_be_synced_fn=self._columns_are_mapped
  File "C:\Users\erik\workspace\flasktest\lib\site-packages\sqlalchemy\orm\relationships.py", line 115, in __init__
    self._annotate_fks()
  File "C:\Users\erik\workspace\flasktest\lib\site-packages\sqlalchemy\orm\relationships.py", line 311, in _annotate_fks
    self._annotate_present_fks()
  File "C:\Users\erik\workspace\flasktest\lib\site-packages\sqlalchemy\orm\relationships.py", line 331, in _annotate_present_fks
    secondarycols = util.column_set(self.secondary.c)
AttributeError: 'RelationshipProperty' object has no attribute 'c'

私は本当に途方に暮れています。このエラーの助けをいただければ幸いですが、SQLalchemyを従来のMSSQLデータベースで機能させることができる別のアプローチを誰かが提案できる場合は、それも解決策です。

私が言ったように、sqlautocodeはもう機能していないようですが、おそらく私はそれを間違った方法で使用しているか、または私が知らない代替ツールがあるかもしれません。

エリック

4

1 に答える 1

2

さて、みんな、自分でそれを理解しました。

テーブル定義が含まれているファイルがいくつかありました(sqlautocodeからの出力)。1つは「database.py」、もう1つは「model.py」、最後の1つは「ORM.py」と呼ばれていました。

'model.py'をインポートしたtest.pyファイルがありました。Model.pyは、テーブル定義を書き込んだファイルです。ただし、test.pyページもFlask(from app import app, db)内からデータベースをインポートして__init__()おり、Flaskアプリの機能では、Flaskはまだ「ORM.py」を読み込んでいました。 。

そのため、一部のオブジェクトは、私が実験していたmodel.pyからではなく、sqlautocodeによって生成された古いファイルであるORM.pyからのものでした。

ORM.pyの名前を変更すると、手がかりが得られました。私はPythonで、MSSQLのテーブルと列をトラバースし、model.pyを生成する非常に単純なスクリプトを作成しました。私は今そのmodel.pyファイルを排他的にロードし、すべてが機能します!

誰かがこれに時間を費やしていた場合は申し訳ありません。それが誰かが同じ問題をグーグルで検索するのに役立つことを願っています。

エリック

于 2013-03-27T14:43:59.950 に答える