我是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)
答案 0 :(得分:-1)
for row in session.query(CpuTable).all():
item = row['CpuTable']
print(item.cpu_id,item.cpu_name)