Невозможно получить доступ к базе данных из метода - PullRequest
1 голос
/ 28 февраля 2010

Я получаю сообщение об ошибке: « TypeError: объект« Осколок »является неподписанным

#Establish an on-demand connection to the central database
def connectCentral():
    engine = engine_from_config(config, 'sqlalchemy.central.')
    central.engine = engine
    central.Session.configure(bind=engine)

#Establish an on-demand connection to a shard that contains
#data for the supplied id
def connectShard(id):

    #If no connection has been made to the central database
    #make one to determine the shard info
    if central.engine == None:
        print 'Connecting to central database'
        connectCentral()

    shard_info = central.Session.query(Shard).filter_by(id=id).first()

    #If no shard exists for the given id, return false
    if shard_info == None:
        return 'None'

    shard.engine = shard_info['sqlite']
    shard.Session.configure(bind=shard.engine)

c_shard = sa.Table("Shard", central.metadata,
sa.Column("id", sa.types.Integer, primary_key=True),
sa.Column("ip",sa.types.String(100), nullable=False),
sa.Column("username",sa.types.String(100), nullable=False),
sa.Column("password",sa.types.String(100), nullable=False),
sa.Column("port",sa.types.String(100), nullable=False),
sa.Column("active",sa.types.String(100), nullable=False),
sa.Column("sqlite",sa.types.String(100), nullable=True)
)

Вывод ошибки:

connectShard(232)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/project/project/model/__init__.py", line 39, in connectShard
    shard.Session.configure(bind=shard.engine)
TypeError: 'Shard' object is unsubscriptable

Ответы [ 2 ]

0 голосов
/ 08 июля 2010

Я предполагаю, что ошибка в этой строке:

    shard.engine = shard_info['sqlite']

потому что shard_info - единственный объект класса Shard, который я вижу, и это единственная операция подписки в вставленном коде. В трассировке отображается другая строка, поэтому, возможно, вы редактировали источник после его импорта?

Возвращаемся к ошибке: объекты SQLAlchemy не являются словарями, поэтому вы хотите

    shard.engine = shard_info.sqlite

но это бы присвоило ядру строку (имя файла? Sqlalchemy url?), А это не то, что вы должны передать Session.configure() Я предполагаю, что вы хотите что-то вроде

    dbname = shard_info.sqlite
    shard.engine = create_engine('sqlite:///' + dbname)
    shard.Session.configure(bind=shard.engine)
0 голосов
/ 28 февраля 2010

Учитывая неполный фрагмент кода, который вы дали, единственная соответствующая строка:

shard.Session.configure(bind=shard.engine)

Индикация ошибки является базовой ошибкой типа Python, скаляр (или нет) должен быть подписан внутри SQLAlchemy. Это почти наверняка является результатом не полностью или ошибочно созданного сеанса в части кода, которую вы не показали.

...