2016-01-07 2 views
0

Не удалось сделать peewee работы с простейшим примером:Хранится получать «неправильный тип (ожидаемый basestring, есть строка)» при использовании Peewee для создания таблиц в базе данных SQLite

from peewee import * 

db = SqliteDatabase('people.db') 

class Person(Model): 
    name = CharField() 
    birthday = DateField() 
    is_relative = BooleanField() 

    class Meta: 
     database = db # This model uses the "people.db" database. 

class Pet(Model): 
    owner = ForeignKeyField(Person, related_name='pets') 
    name = CharField() 
    animal_type = CharField() 

    class Meta: 
     database = db # this model uses the "people.db" database 

db.connect() 
db.create_tables([Person, Pet]) 

И я получил эту странную ошибку:

Traceback (most recent call last): 
    File "D:\EclipseWorkspace\peewee_test.py", line 22, in <module> 
    db.create_tables([Person, Pet]) 
    File "D:\Program Files (x86)\Python2.7.3\lib\site-packages\peewee.py", line 3448, in create_tables 
    create_model_tables(models, fail_silently=safe) 
    File "D:\Program Files (x86)\Python2.7.3\lib\site-packages\peewee.py", line 4767, in create_model_tables 
    m.create_table(**create_table_kwargs) 
    File "D:\Program Files (x86)\Python2.7.3\lib\site-packages\peewee.py", line 4459, in create_table 
    db.create_table(cls) 
    File "D:\Program Files (x86)\Python2.7.3\lib\site-packages\peewee.py", line 3445, in create_table 
    return self.execute_sql(*qc.create_table(model_class, safe)) 
    File "D:\Program Files (x86)\Python2.7.3\lib\site-packages\peewee.py", line 1865, in inner 
    return self.parse_node(fn(*args, **kwargs)) 
    File "D:\Program Files (x86)\Python2.7.3\lib\site-packages\peewee.py", line 1577, in parse_node 
    sql, params, unknown = self._parse(node, alias_map, conv) 
    File "D:\Program Files (x86)\Python2.7.3\lib\site-packages\peewee.py", line 1551, in _parse 
    sql, params = self._parse_map[node_type](node, alias_map, conv) 
    File "D:\Program Files (x86)\Python2.7.3\lib\site-packages\peewee.py", line 1479, in _parse_clause 
    node.nodes, alias_map, conv, node.glue) 
    File "D:\Program Files (x86)\Python2.7.3\lib\site-packages\peewee.py", line 1594, in parse_node_list 
    node_sql, node_params = self.parse_node(node, alias_map, conv) 
    File "D:\Program Files (x86)\Python2.7.3\lib\site-packages\peewee.py", line 1577, in parse_node 
    sql, params, unknown = self._parse(node, alias_map, conv) 
    File "D:\Program Files (x86)\Python2.7.3\lib\site-packages\peewee.py", line 1551, in _parse 
    sql, params = self._parse_map[node_type](node, alias_map, conv) 
    File "D:\Program Files (x86)\Python2.7.3\lib\site-packages\peewee.py", line 1481, in _parse_clause 
    sql = '(%s)' % strip_parens(sql) 
TypeError: Argument 's' has incorrect type (expected basestring, got str) 

Я искал какое-то время, и выглядит, как будто это cython проблема, связанная, некоторые предлагаемые обновления cython до последней стабильной версии, но я все равно получил эту ошибку с cython0.23.4, кто-нибудь знает, как исправить эту проблему?

ответ

0

Выяснено решение для этого. basestring представляет собой новый тип строки, начиная с cython0,20, и в соответствии с peewee docs:

Speedups, which includes miscellaneous functions re-implemented with Cython. This module will be built automatically if Cython is installed.

Так в основном playhouse/_speedups.pyd был построен с cython0,19 во время установки, а затем я сделал обновление cython к 0,23. 4, но это не повлияет на файл.

После переустановки/восстановления peewee теперь все работает правильно.

0

Ну, чтобы это заработало Вы можете создавать таблицы в цикле

for table in [Pet, Person]: 
    db.create_table(table) 

хотя я должен сказать, что я проверил это с более старыми Cython (0.21.1) - Я посмотрю, что по-прежнему возможно после уточнения ... возможно (0.23.4). Но я вижу, что ваш Python довольно старый, вы можете рассмотреть возможность обновления (2.7.10, похоже, является последним выпуском версии 2.7.x от 2016.01.07)

+0

Ну, 'для таблицы в [Person, Pet]: db.create_table (table)' дает ту же ошибку, что и раньше. Не совсем уверен, что сам python вызывает эту проблему, но не хочет обновлять ее прямо сейчас из-за некоторых потенциальных проблем совместимости. – Shane

+0

Если вы не хотите обновлять Python, то в качестве альтернативы вам может потребоваться исправление 'D: \ Program Files (x86) \ Python2.7.3 \ lib \ site-packages \ peewee.py', который я бы не рекомендовал. Кроме того, у меня нет других идей, извините. – JustMe

+0

Решил проблему. Это фактически вызвано 'playhouse/_speedups.pyd', которое было построено относительно более низкой версией (0.19, если быть точным)' cython' во время установки. И 'basestring' был введен в 0.20. – Shane

 Смежные вопросы

  • Нет связанных вопросов^_^