使用 peewee 在 sqlite 数据库中创建表时一直得到 "incorrect type (expected basestring, got str)"
Kept getting "incorrect type (expected basestring, got str)" when using peewee to create tables in sqlite database
无法使 peewee
使用最简单的示例:
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
更新到最新的稳定版本,但我仍然遇到 cython
0.23.4,有人知道如何解决这个问题吗?
好吧,让它工作你可以在循环中创建表
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)
想出解决办法。
basestring
是一个新的字符串类型,从cython
0.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
是在安装过程中用 cython
0.19 构建的,后来我确实将 cython
更新为 0.23.4 但它不会对文件产生任何影响。
在 peewee
的 reinstallation/rebuild 之后,现在一切正常。
无法使 peewee
使用最简单的示例:
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
更新到最新的稳定版本,但我仍然遇到 cython
0.23.4,有人知道如何解决这个问题吗?
好吧,让它工作你可以在循环中创建表
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)
想出解决办法。
basestring
是一个新的字符串类型,从cython
0.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
是在安装过程中用 cython
0.19 构建的,后来我确实将 cython
更新为 0.23.4 但它不会对文件产生任何影响。
在 peewee
的 reinstallation/rebuild 之后,现在一切正常。