cod*_*nob 12 python mysql select create-table peewee
我正在尝试学习如何使用myse的peewee.
我在具有现有表的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()
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
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'")
Run Code Online (Sandbox Code Playgroud)
为什么peewee会在select查询中添加'id'列?我没有在数据库中已存在的表中的id列.我只想使用现有的表,而不是每次我想与数据库交互时都要依赖peewee创建一个表.这是我认为错误的地方.
查询的结果应该是空的,因为表是空的,但因为我正在学习,我只是想尝试代码.我感谢您的帮助.
编辑
基于Wooble和Francis的有用回应,我开始怀疑使用peewee或其他ORM(如sqlalchemy)是否合理.使用ORM而不是仅使用MySQLdb在python中运行直接查询有什么好处?
这是我期望做的事情:
- 自动从各种Web服务器下载数据.大多数数据采用xls或csv格式.我可以使用xlrd包将xls转换为csv.
- 在插入/批量插入到mysql数据库表之前,对列表对象中的数据进行分析/处理.
- 运行复杂查询以将数据从mysql导出到python中,形成适当的数据结构(例如列表),用于各种统计计算,这在python而不是mysql中更容易实现.可以在mysql中完成的任何事情都可以在那里完成,但我可能会在python中运行复杂的回归.
- 从查询中检索的数据上运行各种图形包.其中一些可能包括使用ggplot2包(来自R-project),这是一个高级图形包.所以我将涉及一些R/Python集成.
鉴于上述情况 - 最好是花费时间去学习ORM/Peewee/SQLAlchemy或坚持使用MySQLdb直接进行mysql查询?
Fra*_*ila 16
大多数简单的活动记录模式ORM需要一id列来跟踪对象标识.PeeWee似乎是其中之一(或者至少我不知道任何不使用id的方法).您可能无法在不更改表格的情况下使用PeeWee.
您现有的表格似乎设计得不是很好,因为它似乎缺少密钥或复合密钥.每个表都应该有一个键属性 - 否则不可能将一行与另一行区分开来.
如果其中一列是主键,请尝试添加primary_key=True参数,如有关非整数主键的文档中所述
date = DateField(primary_key=True)
Run Code Online (Sandbox Code Playgroud)
请注意,我不确定PeeWee是否会对主键未命名感到不满id.
您应该调查SQLAlchemy,它使用数据映射器模式.它更复杂,但也更强大.它对您的SQL表设计没有任何限制,事实上它可以在大多数情况下自动反映您的表结构和相互关系.(在MySQL中可能不太好,因为在默认表引擎中看不到外键关系.)最重要的是,它可以处理缺少键的表.
如果您的主键列名称不是"id",则应向该表模型类添加其他字段:
class Table(BaseModel):
id_field = PrimaryKeyField()
Run Code Online (Sandbox Code Playgroud)
这将告诉您的脚本您的表具有存储在名为"id_field"的列中的主键,并且该列是启用了自动增量的INT类型. 这是描述peewee中字段类型的文档.
如果你想要对主键字段进行更多控制,正如Francis Avila已经指出的那样,你应该在创建字段时使用primary_key = True参数:
class Table(BaseModel):
id_field = CharField(primary_key=True)
Run Code Online (Sandbox Code Playgroud)
请参阅非整数主键文档中的此链接
| 归档时间: |
|
| 查看次数: |
12494 次 |
| 最近记录: |