Почему peewee включает столбец " id " в запрос выбора mysql?

Я пытаюсь научиться использовать pewee с 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 " в запрос select? У меня нет столбца id в таблице, который уже существует в базе данных. Я просто хочу работать с существующей таблицей и не зависят от peewee должен создавать его каждый раз, когда я хочу взаимодействовать с базой данных. Вот где, я думаю, ошибка.

результат запроса должен быть пустым, так как таблица пуста, но так как я учусь, я просто хотел попробовать код. Я ценю вашу помощь.

редактировать

это то, что я ожидаю сделать:

-автоматическая загрузка данных из различных веб-серверов. Большая часть данных находится в формате xls или csv. Я могу преобразовать xls в csv, используя пакет xlrd.

- разбор / обработка данных в объектах списка перед вставкой / массовой вставкой в таблицу БД mysql.

- выполнение сложных запросов для экспорта данных из mysql в python в соответствующие структурированные данные (например, списки) для различных статистических вычислений, которые проще делать в python вместо mysql. Все, что можно сделать в mysql, будет сделано там, но я могу запускать сложные регрессии в python.

- запуск различных графических пакетов на данных, полученных из запросов. Некоторые из них могут включать использование пакета ggplot2 (из R-project), который является расширенным графическим пакетом. Поэтому я буду привлекать некоторые R / Python интеграция.

учитывая вышесказанное-лучше всего, что я провожу часы взлома, чтобы узнать ORM/Peewee / SQLAlchemy или придерживаться прямых запросов mysql с помощью MySQLdb?

4 ответов


самый простой шаблон активной записи ORMs нужен id столбец для отслеживания идентификатора объекта. Крошка, кажется, один из них (или, по крайней мере, я не знаю никакого способа не используйте id). Вы, вероятно, не можете использовать Pewee, не изменяя свои столы.

ваша существующая таблица, похоже, не очень хорошо спроектирована, так как она, похоже, не имеет ключа или составного ключа. Каждая таблица должна иметь ключевой атрибут-иначе невозможно отличить одну строку от другой другой.

если один из этих столбцов является первичным ключом, попробуйте добавить


Если имя столбца первичного ключа отличается от "id", вы должны добавить дополнительное поле в этот класс модели таблицы:

class Table(BaseModel):
    id_field = PrimaryKeyField()

это сообщит вашему скрипту, что ваша таблица имеет первичные ключи, хранящиеся в столбце с именем "id_field", и этот столбец имеет тип INT с включенным автоматическим приращением. здесь - это документация, описывающая типы полей в Пиви.

Если вы хотите больше контроля над полем первичного ключа, Как уже указал Фрэнсис Авила, вы должны использовать primary_key=True аргумент при создании поля:

class Table(BaseModel):
    id_field = CharField(primary_key=True)

посмотреть этой ссылке в документации по нецелочисленным первичным ключам


вы должны предоставить поле primary_key для этой модели. Если в вашей таблице нет ни одного поля primary_key(как и в моей), a CompositeKey определенный в Meta поможет.

primary_key = peewee.CompositeKey('date', 'team')

вам нужно использовать метод create table peewee для создания фактической таблицы базы данных, прежде чем вы сможете вызвать select(), который создаст столбец ID в таблице.