使用PeeWee ORM我有以下查询:
query = DataModel.select()where(DataModel.field == "value")
Run Code Online (Sandbox Code Playgroud)
有没有办法转换query成pandas DataFrame而不迭代所有的值?我正在寻找一种更"Pythonic"的方式来做到这一点.
使用Flask Mega 教程我正在尝试学习 Flask。在本教程的第 5 部分中,我现在正在构建一个需要用户登录的个人资料页面。
由于我使用 peewee ORM 而不是 SQLAlchemy,因此我确实在这里或那里调整了代码,但对于这种情况,我认为这并不重要。我现在使用我的 Google (openID) 帐户登录并遇到错误,提示AttributeError: 'NoneType' object has no attribute 'is_active'。该错误发生在该函数末尾的行中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).first()
if user is None:
nickname = resp.nickname
if nickname is None or nickname == "":
nickname = resp.email.split('@')[0]
User(nickname = nickname, email = resp.email, role = …Run Code Online (Sandbox Code Playgroud) 我计划使用 SQLite 和 Peewee (ORM) 来实现轻型内部 Web 服务(每秒<20 个请求)。Web 服务可以处理多个线程上的多个并发请求。在每次请求期间,数据库都会被读取和写入。这意味着我需要具备并发读取和写入的能力。如果数据在读取和写入之间发生变化,对于该应用程序来说并不重要。
SQLite FAQ说允许并发读取,但来自多个线程的并发写入需要获取文件锁。我的问题是:Peewee 是否会为我处理这种锁定,或者我需要在代码中做些什么才能实现这一点?
Peewee 数据库对象在线程之间共享。我认为这意味着数据库连接也是共享的。
我找不到 Peewee 对此的具体答案,所以我在这里问。
下面的前三个查询返回正确的数字,而最后一个查询返回错误的数字。它应该返回 153,而不是返回 8193。我不知道这个数字来自哪里。
迭代查询正确返回 153 条记录。
>>> Project.select().where(Project.number.between('2012-01', '2012-02')).count()
75
>>> Project.select().where(Project.number.between('2012-02', '2012-03')).count()
78
>>> Project.select().where(Project.number.between('2012-01', '2012-03')).count()
153
>>> (Project.select().where(Project.number.between('2012-01', '2012-02')) |
Project.select().where(Project.number.between('2012-01', '2012-03'))).count()
8193
Run Code Online (Sandbox Code Playgroud)
编辑
这是一个从空数据库开始重现问题的函数。
def test(self):
db = peewee.SqliteDatabase('test.db', check_same_thread=False)
class Test(peewee.Model):
num = peewee.IntegerField()
class Meta:
database = db
Test.drop_table(True)
Test.create_table(True)
for i in range(1, 11):
Test.create(num=i)
q = Test.select().where(Test.num > 6) | Test.select().where(Test.num > 7)
print(q)
print('Count =', q.count())
for i in q:
print(i.num)
Run Code Online (Sandbox Code Playgroud)
这是它的输出。它表明迭代正确返回 4 个项目,但计数错误:
<class 'DocFinder.DocFinder.DocFinder.test.<locals>.Test'> SELECT t2."id", t2."num" FROM "test" AS …Run Code Online (Sandbox Code Playgroud) 简单的 peewee 示例:带有自动增量“id”和字符字段“name”的 MySQL 数据库“Pet”。
正在做
my_pet = Pet.select().where(name == 'Garfield')
Run Code Online (Sandbox Code Playgroud)
使用 .sql() 我们得到 sql 解释。
如何从以下位置获取原始 sql 查询:
my_pet = Pet.get(name='Garfield')
Run Code Online (Sandbox Code Playgroud)
?
我想从多个数据库复制数据,处理它们,然后将它们移动到主数据库。所有数据库都具有相同的架构。
即使我打开和关闭数据库,peewee 总是连接到同一个数据库(列表中的第三个)并且不遵守连接顺序。
databases = [spie_db, opticsorg_db, phcom_db]
# map to a dictionary the values from the record
def mapping(record):
comp_d = {'name': record.name,
'address': record.address,
'country': record.country,
'website': record.website,
'domain': record.domain
}
return comp_d
def merge_data():
company_list = []
for database in databases:
database.connect()
# cycle trough db
for record in Company.select():
# append each record to the list
company_list.append(mapping(record))
database.close()
return company_list
# get data from the other databases
companies = merge_data()
# the merge database
db.connect()
# …Run Code Online (Sandbox Code Playgroud) 如何ids从 Peewee 中的批量插入中获取?
我需要返回插入的 id 来创建一个新的 dict 数组,如下所示:
a = [{"product_id": "inserted_id_1", "name": "name1"}, {"product_id": "inserted_id_2", "name": "name1"}]
Run Code Online (Sandbox Code Playgroud)
然后我需要使用批量插入它,例如:
ids = query.insertBulk(a)
Run Code Online (Sandbox Code Playgroud)
反过来,最后一个查询应该返回我的新 ID 以进行进一步的类似插入。
我无法使用通常的init () 方法初始化“peewee.Model”后代对象的字段。我该如何初始化?
import peewee
peewee_database = peewee.SqliteDatabase('example.db')
class Config():
def __init__(self, seats, cylinders):
self.seats = seats
self.cylinders = cylinders
class Car(peewee.Model):
magic_number = peewee.IntegerField()
color = peewee.TextField()
class Meta:
database = peewee_database
def __init__(self, config):
self.magic_number = config.seats / config.cylinders
self.color = None
peewee_database.connect()
peewee_database.create_tables([Car])
config = Config(7, 6)
car = Car(config)
car.color = "blue"
car.save()
Run Code Online (Sandbox Code Playgroud)
在 Python3 中产生此错误:
File "test.py", line 27, in <module>
car = Car(config)
File "test.py", line 20, in __init__
self.magic_number = config.seats / …Run Code Online (Sandbox Code Playgroud) 我是一名 Discord 机器人开发人员,最近完成了一个订单。客户端在其服务器上设置应用程序时最初没有问题,但根据他们的说法,在运行“大约三个小时”后,程序开始吐出特定的堆栈跟踪错误并且不再接受命令。
该机器人使用 Discord.py 构建,并使用 Peewee 作为 ORM,使用 PyMySQL 作为数据库驱动程序。客户端运行它的服务器由 DigitalOcean 托管,如果需要有关硬件等的任何信息,客户端可以根据请求向我提供该信息。我们已经尝试卸载并重新安装所有依赖项,以及尝试它们的不同发行版,但错误仍然存在。
这是客户端正在接收的确切跟踪:
File "/usr/local/lib/python3.6/dist-packages/peewee.py", line 2666, in __exit__
reraise(new_type, new_type(*exc_args), traceback)
File "/usr/local/lib/python3.6/dist-packages/peewee.py", line 179, in reraise
raise value.with_traceback(tb)
File "/usr/local/lib/python3.6/dist-packages/peewee.py", line 2875, in execute_sql
cursor.execute(sql, params or ())
File "/usr/local/lib/python3.6/dist-packages/pymysql/cursors.py", line 170, in execute
result = self._query(query)
File "/usr/local/lib/python3.6/dist-packages/pymysql/cursors.py", line 328, in _query
conn.query(q)
File "/usr/local/lib/python3.6/dist-packages/pymysql/connections.py", line 516, in query
self._execute_command(COMMAND.COM_QUERY, sql)
File "/usr/local/lib/python3.6/dist-packages/pymysql/connections.py", line 750, in _execute_command
raise err.InterfaceError("(0, '')")
peewee.InterfaceError: (0, '')
Run Code Online (Sandbox Code Playgroud)
我的 database.py 文件中的相关部分,其中打开了数据库连接: …
我在 Python 中使用 ORM peewee来实现 sqlite。我想创建一个表,其中的Item字段parent_id将作为外键Item:
from peewee import *
db = SqliteDatabase("data.db")
class Item(Model):
id = AutoField()
parent_id = ForeignKeyField(Item, null = True)
class Meta:
database = db
db.create_tables([Item])
Run Code Online (Sandbox Code Playgroud)
但是,由于循环外键,出现错误:
NameError:在封闭范围内赋值之前引用了自由变量“Item”
DeferredForeignKey对于这种情况, peewee中有:
from peewee import *
db = SqliteDatabase("data.db")
class Item(Model):
id = AutoField()
parent_id = DeferredForeignKey("Item", null = True)
class Meta:
database = db
db.create_tables([Item])
Item._schema.create_foreign_key(Item.parent_id)
Run Code Online (Sandbox Code Playgroud)
不幸的是,sqlite中没有ADD CONSTRAINT,所以出现另一个错误:
peewee.OperationalError:靠近“CONSTRAINT”:语法错误
有没有办法使用 peewee 在 sqlite 中创建循环外键,或者我必须使用纯整数而不是外键或使用本机 SQL 而不是 ORM?
peewee ×10
python ×8
python-3.x ×4
sqlite ×4
database ×2
attributes ×1
concurrency ×1
discord.py ×1
flask ×1
flask-peewee ×1
foreign-keys ×1
pandas ×1
pymysql ×1
python-2.7 ×1