我正在努力学习如何使用peewee与mysql。
我在mysql服务器上有一个现有的数据库和一个现有的表。表当前是空的(我现在只是在测试)。
>>> db = MySQLDatabase('nhl', user='root', passwd='blahblah')
>>> db.connect()
>>> class schedule(Model):
... date = DateField()
... team = CharField()
... class Meta:
... database = db
>>> test = schedule.select()
>>> test
<class '__main__.schedule'> SELECT t1.`id`, t1.`date`, t1.`team` FROM `nhl` AS t1 []
>>> test.get()
我得到以下错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.6/site-packages/peewee.py", line 1408, in get
return clone.execute().next()
File "/usr/lib/python2.6/site-packages/peewee.py", line 1437, in execute
self._qr = QueryResultWrapper(self.model_class, self._execute(), query_meta)
File "/usr/lib/python2.6/site-packages/peewee.py", line 1232, in _execute
return self.database.execute_sql(sql, params, self.require_commit)
File "/usr/lib/python2.6/site-packages/peewee.py", line 1602, in execute_sql
res = cursor.execute(sql, params or ())
File "/usr/lib64/python2.6/site-packages/MySQLdb/cursors.py", line 201, in execute
self.errorhandler(self, exc, value)
File "/usr/lib64/python2.6/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
raise errorclass, errorvalue
_mysql_exceptions.OperationalError: (1054, "Unknown column 't1.id' in 'field list'")
为什么peewee在select查询中添加'id‘列?表中没有数据库中已经存在的id列。我只是想使用现有的表,而不是每次想要与数据库交互时都要创建一个peewee。这就是我认为错误所在的地方。
查询的结果应该是空的,因为表是空的,但是由于我正在学习,所以我只想尝试一下代码。谢谢你的帮助。
编辑
基于Wooble和Francis的有益回应,我开始怀疑使用peewee或另一种ORM (如sqlalchemy )是否有意义。使用ORM而不是仅仅使用MySQLdb在python中运行直接查询有什么好处?
这就是我想要做的:
-automatically从各种web服务器下载数据。大多数数据采用xls或csv格式。我可以使用xlrd包将xls转换为csv。
-在插入/批量插入mysql db表之前,解析/处理list对象中的数据。
-running复杂的查询将数据从mysql导出到python到适当的数据结构中(例如列表),用于各种统计计算,这在python中比mysql更容易完成。在mysql中可以完成的任何事情都将在那里完成,但我可能在python中运行复杂的回归。
-run从查询中检索的数据上的各种图形包。其中一些可能包括使用ggplot2包(来自R),这是一个高级的图形包。因此,我将涉及一些R/Python集成。
鉴于以上所述,我是否最好花上几个小时的时间来学习ORM/Peewee/SQLAlchemy,还是坚持使用MySQLdb直接执行mysql查询?
发布于 2013-03-22 00:04:14
大多数简单的活动记录模式ORM需要一个id
列来跟踪对象标识。PeeWee似乎是其中之一(或者至少我不知道任何不使用id的方法)。如果不更改表,您可能无法使用PeeWee。
您现有的表似乎没有很好的设计,因为它似乎缺少一个键或复合键。每个表都应该有一个键属性,否则就不可能区分一行和另一行。
如果其中一列是主键,请尝试添加一个primary_key=True
参数,如解释的在有关非整数主键的文档中。
date = DateField(primary_key=True)
如果主键未命名为id
,则必须将表的实际主键设置为表的peewee模型中的"PrimaryKeyField()“类型。
您应该研究SQLAlchemy,它使用数据映射器模式。它更复杂,但也更强大。它不对SQL表的设计施加任何限制,实际上,它在大多数情况下可以自动反映表结构和相互关系。(在MySQL中可能不太好,因为在默认表引擎中看不到外键关系。)对您来说,最重要的是,它可以处理缺少密钥的表。
发布于 2013-04-17 15:56:08
发布于 2014-05-26 06:22:23
您必须为该模型提供一个primary_key字段。如果您的表没有一个primary_key字段(就像我的表一样),那么在Meta中定义的CompositeKey就会有帮助。
primary_key = peewee.CompositeKey('date', 'team')
https://stackoverflow.com/questions/15559468
复制相似问题