2010-02-28 4 views
1

Я продолжаю получать ошибку: «ТипError: объект« Shard »не подлежит подпискеНе удается получить доступ к базе данных по методу

#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 

ответ

0

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

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

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

0

Я думаю, что ошибка в этой строке:

 
    shard.engine = shard_info['sqlite'] 

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

Назад к ошибке: объекты 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) 
Смежные вопросы