python - 为什么 peewee 在 mysql 选择查询中包含 'id' 列?

标签 python mysql select create-table peewee

我正在尝试学习如何将 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 将“id”列添加到选择查询中?我在数据库中已经存在的表中没有 id 列。我只是想使用现有的表,而不是依赖于 peewee 每次我想与数据库交互时都必须创建一个表。这是我认为错误的地方。

查询结果应该是空的,因为表是空的,但由于我正在学习,所以我只是想尝试一下代码。感谢您的帮助。

编辑

根据 Wooble 和 Francis 的有用回复,我开始怀疑使用 peewee 或其他 ORM(如 sqlalchemy)对我来说是否有意义。使用 ORM 而不是仅使用 MySQLdb 在 python 中运行直接查询有什么好处?

这是我期望做的:

-自动从各种网络服务器下载数据。大部分数据为 xls 或 csv 格式。我可以使用 xlrd 包将 xls 转换为 csv。

-在插入/批量插入 mysql 数据库表之前解析/处理列表对象中的数据。

- 运行复杂的查询,将数据从 mysql 导出到 python 中,以适当的数据结构(例如列表)进行各种统计计算,这在 python 中比在 mysql 中更容易完成。可以在 mysql 中完成的任何事情都可以在 mysql 中完成,但我可能会在 python 中运行复杂的回归。

- 对从查询中检索到的数据运行各种图形包。其中一些可能包括使用 ggplot2 包(来自 R-project),这是一个高级图形包。所以我将涉及一些 R/Python 集成。

鉴于上述情况——我最好花几个小时学习 ORM/Peewee/SQLAlchemy 还是坚持使用 MySQLdb 直接进行 mysql 查询?

最佳答案

大多数简单的事件记录模式 ORM 需要一个 id 列来跟踪对象身份。 PeeWee 似乎是其中之一(或者至少我不知道有任何方式使用 id)。如果不更改表格,您可能无法使用 PeeWee。

无论如何,您现有的表似乎设计得不是很好,因为它似乎缺少键或复合键。每个表都应该有一个关键属性——否则就不可能区分一行。

如果这些列之一是主键,请尝试添加 primary_key=True 参数,如 in the docs concerning non-integer primary keys 所述

date = DateField(primary_key=True)

如果您的主键未命名为 id,那么您必须在该表的 peewee 模型中将表的实际主键设置为“PrimaryKeyField()”类型。

你应该调查 SQLAlchemy ,它使用数据映射器模式。它更复杂,但也更强大。它对你的 SQL 表设计没有任何限制,事实上它可以在大多数情况下自动反射(reflect)你的表结构和相互关系。 (在 MySQL 中可能不太好,因为外键关系在默认表引擎中不可见。)对您来说最重要的是,它可以处理缺少键的表。

关于python - 为什么 peewee 在 mysql 选择查询中包含 'id' 列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15559468/

相关文章:

Python 生成用于 S3 上传的 AWS CLI 进程,但它变得非常慢

python - 使用一个 glob.glob 而不是多个 glob.glob

mysql - 如何使远程 MySQL 连接更快?

mysql - mysqlcheck -q 是否与 mysqlcheck -r 一样彻底

javascript - 使用 jQuery 在不同的 `div` 之间标记一行

Python 无法从 'setuptools' 包中导入名称

python - 在升级到新版本之前我需要卸载 Python 包吗?

php - 修复骇人听闻的 SQL where 子句

php - 基本的mysqli选择

sql - 大查询结果是否总是有序的,即 : using OFFSET makes sense to skip rows?