无法找到列中的列

时间:2014-02-12 11:34:28

标签: python mysql sqlalchemy

我是SQLAlchemy的新用户,并按照他们网站上的教程进行操作。 我运行了他们的教程,向数据库添加信息并查询虚拟数据库(内存中的sqlite)。

在我以为我得到了它之后,我尝试对一个真正的db - mysql db进行测试。 我正在使用pymysql驱动程序版本0.4(我知道它有点旧,但是当使用更新的版本时,我有其他错误,与此主题无关​​)。

我的代码如下:

def read_from_DB():
    engine = create_engine('mysql+pymysql://***@***/test', echo=True)
    Session = sessionmaker(bind=engine)
    session=Session()

    #insert = CpuTable(id='15',name= 'igal')
    #session.add(insert)
    #session.commit()

    print()
    print(str(session.query(CpuTable.id.label('id')).all()))


    for cpu_id,cpu_name in session.query(CpuTable).all():
        print(cpu_id,cpu_name)

我的堆栈跟踪如下:

C:\Python33\python.exe J:/working_dir/TLM/lib/DB_Wrapper/Lab_DB/DB_Reader.py
2014-02-12 11:23:57,193 INFO sqlalchemy.engine.base.Engine SELECT DATABASE()
2014-02-12 11:23:57,193 INFO sqlalchemy.engine.base.Engine ()
2014-02-12 11:23:57,196 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'character_set%%'
2014-02-12 11:23:57,196 INFO sqlalchemy.engine.base.Engine ()
2014-02-12 11:23:57,198 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'sql_mode'
2014-02-12 11:23:57,198 INFO sqlalchemy.engine.base.Engine ()
2014-02-12 11:23:57,199 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2014-02-12 11:23:57,199 INFO sqlalchemy.engine.base.Engine SELECT cpu.id AS id 
FROM cpu
2014-02-12 11:23:57,199 INFO sqlalchemy.engine.base.Engine ()
Traceback (most recent call last):
  File "C:\Python33\lib\site-packages\sqlalchemy-0.9.0-py3.3.egg\sqlalchemy\engine\result.py", line 69, in __getitem__
KeyError: <sqlalchemy.sql.elements.Label object at 0x0000000003C6FDA0>

在处理上述异常期间,发生了另一个异常:

Traceback (most recent call last):
  File "J:/working_dir/TLM/lib/DB_Wrapper/Lab_DB/DB_Reader.py", line 39, in <module>
    read_from_DB()
  File "J:/working_dir/TLM/lib/DB_Wrapper/Lab_DB/DB_Reader.py", line 26, in read_from_DB
    print(str(session.query(CpuTable.id.label('id')).all()))
  File "C:\Python33\lib\site-packages\sqlalchemy-0.9.0-py3.3.egg\sqlalchemy\orm\query.py", line 2264, in all
  File "C:\Python33\lib\site-packages\sqlalchemy-0.9.0-py3.3.egg\sqlalchemy\orm\loading.py", line 75, in instances
  File "C:\Python33\lib\site-packages\sqlalchemy-0.9.0-py3.3.egg\sqlalchemy\orm\loading.py", line 75, in <listcomp>
  File "C:\Python33\lib\site-packages\sqlalchemy-0.9.0-py3.3.egg\sqlalchemy\orm\loading.py", line 74, in <listcomp>
  File "C:\Python33\lib\site-packages\sqlalchemy-0.9.0-py3.3.egg\sqlalchemy\orm\query.py", line 3440, in proc
  File "C:\Python33\lib\site-packages\sqlalchemy-0.9.0-py3.3.egg\sqlalchemy\engine\result.py", line 71, in __getitem__
  File "C:\Python33\lib\site-packages\sqlalchemy-0.9.0-py3.3.egg\sqlalchemy\engine\result.py", line 317, in _key_fallback
sqlalchemy.exc.NoSuchColumnError: "Could not locate column in row for column 'cpu.id'"

调试此问题时,我设法发现我确实从db获取结果,只有当查询为select table.id时才会返回table_id。 (我和一些朋友谈过这个问题,并且他们确认它也发生在他们的手上,只有他们的SQLAlchemy包装器知道如何处理这个问题,而我的投掷会发生这个错误)。注释掉的insert行将检查我是否已连接到数据库,并检查它是否插入了数据,确实如此,查询部分就是问题所在。在针对sqlite内存数据库进行测试时,它确实有效。

使用pymysql驱动程序处理MySQL数据库时会出现什么问题?

试图在网上搜索1天,因为类似的问题甚至找不到1.我的sqlalchemy版本是0.9.1,我把它降级为0.9,但问题仍然存在。

编辑: 以不同的方式,我尝试编写一个不使用类映射的代码。这次我实际上设法检索数据库中的数据。我添加了代码

metadata = MetaData()
cpu = Table('cpu',metadata,
    Column('id',INTEGER,primary_key=True),
    Column('name',String(50))
)
from sqlalchemy.sql import select
q = select([cpu])
conn = engine.connect()
result = conn.execute(q)
for row in result:
    print(row)

因为我没有使用我创建的映射类我认为id显示类本身,可能会给出一些见解:

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,INTEGER,String

class CpuTable(declarative_base()):
    __tablename__ = 'cpu'
    id = Column(INTEGER,primary_key=True)
    name = Column(String(50))

    def __repr__(self):
        return "<cpu(id = '%s',name = '%s')>" % (self.id,self.name)

1 个答案:

答案 0 :(得分:-1)

for row in session.query(CpuTable).all():
    item = row['CpuTable']
    print(item.cpu_id,item.cpu_name)