我正在尝试使用peewee建立数据库ORM,并且不清楚使用外键关系.
from peewee import *
db = SqliteDatabase('datab.db')
class datab(Model):
class Meta:
database = db
class Collection(datab):
identifier = CharField()
title = CharField()
class File(datab):
identifier = ForeignKeyField(Collection, related_name='files')
name = CharField()
Run Code Online (Sandbox Code Playgroud)
后来,我导入了"收藏"
for value in collection:
Collection(**value).save()
Run Code Online (Sandbox Code Playgroud)
最后,我遇到麻烦的地方是将文件添加到集合中
for value in collectionFiles:
File(**value).save()
Run Code Online (Sandbox Code Playgroud)
在值dict中,有一个带有"identifier"键的关键字对和一个应该与Collection标识符关键字相关联的值.
但是我收到一条错误消息:
ValueError: invalid literal for int() with base 10: 'somevalue'
Run Code Online (Sandbox Code Playgroud)
如果我将File(datab):identifier Type更改为VarChar,它将保存数据.
我意识到我做错了.我的假设是每个表中的唯一标识符值将应用外键.阅读文档后,外观设置看起来有点不同.我需要做些什么吗?
Collections.File.files(**values).save()?换句话说,不是进行数据导入,而是加载集合对象,然后通过peewee添加文件关联字段?
组成类File的值
{'crc32': '63bee49d',
'format': 'Metadata',
'identifier': u'somevalue',
'md5': '34104ffce9e4084fd3641d0decad910a',
'mtime': '1368328224',
'name': 'lupi.jpg_meta.txt',
'sha1': '1448ed1159a5d770da76067dd1c53e94d5a01535',
'size': '1244'}
Run Code Online (Sandbox Code Playgroud) 我正在使用flask-peewee制作一个API,如果用户不存在于表中,我想返回404 json,但看起来它正在抛出500错误而不是404错误json:
这是我得到的错误:
UserDoesNotExist: instance matching query does not exist:
SQL: SELECT t1.`id`, t1.`username`, t1.`password`, t1.`email`, t1.`token`, t1.`join_date`, t1.`active`, t1.`admin` FROM `user` AS t1 WHERE ((t1.`active` = %s) AND (t1.`username` = %s))
[Wed Sep 18 20:26:24 2013] [error] [client 173.225.41.154] PARAMS: [True, u'fery3']
Run Code Online (Sandbox Code Playgroud)
码:
@app.route('/api/login/', methods=['POST'])
def authenticate1():
if request.method == 'POST' and request.form['username']:
active = User.select().where(User.active==True)
user2 = User.select().where(User.username==request.form['username']).get()
try:
user = active.where(User.username==request.form['username']).get()
except exceptions: # includes simplejson.decoder.JSONDecodeError
return make_response(jsonify( { 'error': 'Bad request' } …Run Code Online (Sandbox Code Playgroud) 有了Peewee,我试图使用限制如下:
one_ticket = Ticket.select().limit(1)
print one_ticket.count()
Run Code Online (Sandbox Code Playgroud)
但这打印出5.有人知道这里有什么问题吗?
我正在尝试通过遵循Flask Mega教程来学习Peewee ORM与Flask的结合.在本教程的第5部分中,我使用OpenID创建了一个登录.在克服了一堆障碍之后,我现在在下面的行中粘贴的函数中得到一个AttributeError : login_user(user, remember = remember_me).
@oid.after_login
def after_login(resp):
if resp.email is None or resp.email == "":
flash('Invalid login. Please try again.')
return redirect(url_for('login'))
user = User.select().where(User.email == resp.email)
if user.wrapped_count() == 0:
nickname = resp.nickname
if nickname is None or nickname == "":
nickname = resp.email.split('@')[0]
user = User(nickname = nickname, email = resp.email, role = models.ROLE_USER)
user.save()
remember_me = False
if 'remember_me' in session:
remember_me = session['remember_me']
session.pop('remember_me', None)
login_user(user, remember …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用mysql数据库连接peewee中的两个表.这很容易做到这样的事情:
s = Table1.select(Table1, Table2).join(
Table2).naive().where(Table1.Title == "whatever")
Run Code Online (Sandbox Code Playgroud)
不幸的是,我在Table1和Table2中调用了一个与"URL"相同的列.然后,当我选择s.URL时,它会给我Table2中的URL,我不想要它,我想要Table1中的那个.有没有办法不加入Table2.URL列或命名它不同的东西?这个问题似乎解决了常规SQL(不是小便)中的类似问题,有没有办法在peewee做类似的事情?
换句话说,我认为我正在寻找peewee中的" JOIN AS"方法或" DON'T JOIN THIS COLUMN"方法.
非常感谢,Alex
我在Python 3.4中使用简单的html scraper,使用peewee作为ORM(很棒的ORM顺便说一句!).我的脚本需要一堆站点,提取必要的数据并将它们保存到数据库中,但是每个站点都在分离过程中被刮掉,以提高性能并保存数据应该是唯一的.不仅在站点之间,而且在特定站点上都可能存在重复数据,因此我只想将它们存储一次.
示例:帖子和类别 - 多对多关系.在抓取过程中,同一类别在不同的帖子中出现多次.我第一次想要将该类别保存到数据库(创建新行).如果相同的类别出现在不同的帖子中,我想将该帖子与db中已创建的行绑定.
我的问题是 - 我是否必须使用原子更新/插入(插入一个帖子,保存,get_or_create类别,保存,将新行插入多对多表,保存)或者我可以以某种方式使用批量插入?这个问题的最快解决方案是什么?也许某些临时表在进程之间共享,这将在工作结束时批量插入?我正在使用MySQL db.
谢谢答案和时间
我正在使用peewee访问SQLite数据库。
我已经model.py喜欢了:
from peewee import *
db = SqliteDatabase('people.db')
class Person(Model):
name = CharField()
birthday = DateField()
is_relative = BooleanField()
class Meta:
database = db
Run Code Online (Sandbox Code Playgroud)
然后在另一个Python文件(带有import model)中,我使用Person.create()或调用来操纵数据库Person.select(name=='Joe').delete_instance()。
该快速入门说,在结束时调用db.close()关闭连接。这也适用于我的情况吗?我应该打电话给model.db.close()吗?
我希望将我的数据库实现放在一个单独的模块或类中.但我正在努力解决一些细节问题.一个简单的例子:
from peewee import *
db = SqliteDatabase(':memory:')
class BaseModel(Model):
class Meta:
database = db
class User(BaseModel):
name = CharField()
db.connect()
db.create_tables([User,])
db.commit()
@db.atomic()
def add_user(name):
User.create(name=name).save()
@db.atomic()
def get_user(name):
return User.get(User.name == name)
Run Code Online (Sandbox Code Playgroud)
到目前为止,这工作正常.我可以在这里实现我的数据库接口并将其作为模块导入.
现在我希望能够在运行时选择数据库文件.所以我需要一种方法来定义Model类而不需要先定义SqliteDatabase('somefile').我试图将所有内容封装在一个新的Database类中,稍后我可以从中导入并创建一个实例:
from peewee import *
class Database:
def __init__(self, dbfile):
self.db = SqliteDatabase(dbfile)
class BaseModel(Model):
class Meta:
database = self.db
class User(BaseModel):
name = CharField()
self.User = User
self.db.connect()
self.db.create_tables([User,])
self.db.commit()
@self.db.atomic() # Error as self is not known on this level
def …Run Code Online (Sandbox Code Playgroud) 我用烧瓶和小便.有时peewee会抛出这个错误
MySQL server has gone away (error(32, 'Broken pipe'))
Run Code Online (Sandbox Code Playgroud)
Peewee数据库连接
db = PooledMySQLDatabase(database,**{
"passwd": password, "user": user,
"max_connections":None,"stale_timeout":None,
"threadlocals" : True
})
@app.before_request
def before_request():
db.connect()
@app.teardown_request
def teardown_request(exception):
db.close()
Run Code Online (Sandbox Code Playgroud)
在mysql错误"MySQL服务器已经消失(错误(32,'Broken pipe'))"之后,选择查询工作没有问题,但插入,更新,删除查询不起作用.
在插入,更新,删除查询后面工作(在mysql中)但是peewee抛出这个错误.
(2006, "MySQL server has gone away (error(32, 'Broken pipe'))")
Run Code Online (Sandbox Code Playgroud) peewee ×10
python ×9
mysql ×4
flask ×3
database ×2
orm ×2
alias ×1
broken-pipe ×1
bulkinsert ×1
flask-peewee ×1
join ×1
json ×1
limit ×1
sql ×1
sqlite ×1