相关疑难解决方法(0)

SQLAlchemy是否有相当于Django的get_or_create?

我想从数据库中获取一个对象(如果它已经存在)(基于提供的参数),或者如果不存在则创建它.

Django get_or_create(或来源)这样做.SQLAlchemy中是否有等效的快捷方式?

我目前正在明确地写出这样的:

def get_or_create_instrument(session, serial_number):
    instrument = session.query(Instrument).filter_by(serial_number=serial_number).first()
    if instrument:
        return instrument
    else:
        instrument = Instrument(serial_number)
        session.add(instrument)
        return instrument
Run Code Online (Sandbox Code Playgroud)

python django sqlalchemy

148
推荐指数
5
解决办法
5万
查看次数

调试(显示)由SQLAlchemy发送到数据库的SQL命令

我有一个名为Person的ORM类,它包含一个person表:

在设置与db等的连接之后,我运行ff语句.

people = session.query(Person).all()

人员表不包含任何数据(至今),因此当我打印变量人员时,我得到一个空列表.

我将我的ORM类People中引用的表重命名为people_foo(不存在).

然后我再次运行脚本.我很惊讶在尝试访问不存在的表时没有抛出任何异常.

因此,我有以下两个问题:

  1. 我如何设置SQLAlchemy以便将db错误传播回脚本?
  2. 我如何查看(即打印)发送到数据库引擎的SQL

如果它有帮助,我使用PostgreSQL作为数据库

[编辑]

我正在写一个包.在我的people脚本中,我有以下代码(在此缩写):

people = session.query(Person).all()
Run Code Online (Sandbox Code Playgroud)

[EDIT2]

common模块正确设置记录器,我可以在导入common的其他模块中使用logger.

但是在dbfuncs模块中,我收到以下错误/警告:

没有找到记录器"sqlalchemy.engine.base.Engine"的处理程序

python sqlalchemy

79
推荐指数
2
解决办法
6万
查看次数

在Flask-SQLAlchemy中隔离py.test数据库会话

我正在尝试使用Flask-SQLAlchemy构建Flask应用程序; 我使用pytest来测试数据库.其中一个问题似乎是在不同测试之间创建隔离的数据库会话.

我做了一个最小的,完整的例子来突出问题,请注意test_user_schema1()并且test_user_schema2()是相同的.

文件名: test_db.py

from models import User

def test_user_schema1(session):
    person_name = 'Fran Clan'
    uu = User(name=person_name)
    session.add(uu)
    session.commit()

    assert uu.id==1
    assert uu.name==person_name

def test_user_schema2(session):
    person_name = 'Stan Clan'
    uu = User(name=person_name)
    session.add(uu)
    session.commit()

    assert uu.id==1
    assert uu.name==person_name
Run Code Online (Sandbox Code Playgroud)

如果db在我的测试之间真正隔离,那么两个测试都应该通过.但是,最后一次测试总是失败,因为我还没有找到使数据库会话正确回滚的方法.

sqlalchemy_session_fail

conftest.py根据我在Alex Michael的博客文章中看到的内容使用以下内容,但是这个夹具代码中断了,因为它显然没有隔离夹具之间的db会话.

@pytest.yield_fixture(scope='function')
def session(app, db):
    connection = db.engine.connect()
    transaction = connection.begin()

    #options = dict(bind=connection, binds={})
    options = dict(bind=connection)
    session = db.create_scoped_session(options=options)

    yield session

    # Finalize test here
    transaction.rollback()
    connection.close()
    session.remove()
Run Code Online (Sandbox Code Playgroud)

出于这个问题的目的,我构建了一个要点 …

python unit-testing pytest flask flask-sqlalchemy

10
推荐指数
2
解决办法
4440
查看次数

在python sqlite3中使用保存点

我正在尝试将保存点与python 2.6中内置的sqlite3模块一起使用.每次我尝试释放或回滚保存点时,我总是收到一个OperationalError: no such savepoint.我错过了什么?

python version: 2.6.4 (r264:75821M, Oct 27 2009, 19:48:32) 
[GCC 4.0.1 (Apple Inc. build 5493)]
PySQLite version: 2.4.1
sqlite3 version: 3.6.11

Traceback (most recent call last):
  File "spDemo.py", line 21, in <module>
    conn.execute("release savepoint spTest;")
sqlite3.OperationalError: no such savepoint: spTest
Run Code Online (Sandbox Code Playgroud)

从这段代码:

import sys
import sqlite3

print 'python version:', sys.version
print 'PySQLite version:', sqlite3.version
print 'sqlite3 version:', sqlite3.sqlite_version
print

conn = sqlite3.connect('db_spDemo.db')
conn.isolation_level = "DEFERRED"

with conn:
    conn.execute("create table example (A, B);")

with conn:
    conn.execute("insert …
Run Code Online (Sandbox Code Playgroud)

python sqlite savepoints

5
推荐指数
1
解决办法
2866
查看次数