标签: sqlalchemy

sqlalchemy中的scoped_session(session_maker())或plain session_maker()?

我在我的网络项目中使用SQlAlchemy.我应该使用scoped_session(session_maker())或plain session_maker()以及为什么?或者我应该使用其他东西?

## model.py
from sqlalchemy import *
from sqlalchemy.orm import *

engine = create_engine('mysql://dbUser:dbPassword@dbServer:dbPort/dbName',
pool_recycle=3600, echo=False)
metadata = MetaData(engine)
Session = scoped_session(sessionmaker())
Session.configure(bind=engine)
user = Table('user', metadata, autoload=True)

class User(object):
pass

usermapper = mapper(User, user)

## some other python file called abc.py
from models import *

def getalluser():
   session = Session()  
   session.query(User).all()
   session.flush()
   session.close()

## onemore file defg.py
from models import *

def updateuser():
   session = Session()  
   session.query(User).filter(User.user_id == '4').update({User.user_lname: 'villkoo'})
   session.commit()
   session.flush()
   session.close()
Run Code Online (Sandbox Code Playgroud)

我为每个请求创建一个session = Session()对象,然后关闭它.我做对了还是有更好的方法吗?

python django orm sqlalchemy flask-sqlalchemy

30
推荐指数
3
解决办法
2万
查看次数

SQLAlchemy嵌套回滚错误

我在我的python代码中收到了如下错误(它收集了twitter状态并存储在数据库中).

sqlalchemy.exc.InvalidRequestError: This Session's transaction has been rolled back by a nested rollback() call.  To begin a new transaction, issue Session.rollback() first.
Run Code Online (Sandbox Code Playgroud)

我想知道问题是什么,它为什么会发生,我该如何解决它.

我不知道nested rollback.有没有简单的例子nested rollback


编辑:问题解决了.在这种情况下,重点是在我们显式调用rollback之前不会执行回滚,因此当我们包含时nested rollback,我们应该在try语句中编写它,并nested rollbackhttp:// www中写入异常语句(在大多数情况下).sqlalchemy.org/TRAC /维基/ FAQ#Thetransactionisinactiveduetoarollbackinasubtransaction

而且,这是正确的代码示例.我从上面的链接中引用了这个.

sqlalchemy.exc.InvalidRequestError: This Session's transaction has been rolled back by a nested rollback() call.  To begin a new transaction, issue Session.rollback() first.
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy

30
推荐指数
1
解决办法
2万
查看次数

运行GAE开发服务器时,本地MySQLdb连接因para​​mstyle的AttributeError失败

我正在使用Flask-Alchemy构建一个针对Cloud SQL的GAE Flask应用程序,并在dev_appserver构建它时运行以测试应用程序.

但是,如果我将URL 设置SQLALCHEMY_DATABASE_URImysql+gaerdbms:///appname?instance=instanceidURL,则在尝试调用时会收到以下回溯db.create_all():

Traceback (most recent call last):
  # earlier lines omitted for brevity
  File "/Project/app/foo.bar/foo/bar/admin/__init__.py", line 26, in init_db
    db.create_all()
  File "/Project/app/distlib/flask_sqlalchemy/__init__.py", line 856, in create_all
    self._execute_for_all_tables(app, bind, 'create_all')
  File "/Project/app/distlib/flask_sqlalchemy/__init__.py", line 848, in _execute_for_all_tables
    op(bind=self.get_engine(app, bind), tables=tables)
  File "/Project/app/distlib/flask_sqlalchemy/__init__.py", line 797, in get_engine
    return connector.get_engine()
  File "/Project/app/distlib/flask_sqlalchemy/__init__.py", line 473, in get_engine
    self._engine = rv = sqlalchemy.create_engine(info, **options)
  File "/Project/app/distlib/sqlalchemy/engine/__init__.py", line 332, in create_engine
    return strategy.create(*args, **kwargs)
  File "/Project/app/distlib/sqlalchemy/engine/strategies.py", …
Run Code Online (Sandbox Code Playgroud)

python google-app-engine sqlalchemy google-cloud-sql

30
推荐指数
1
解决办法
3624
查看次数

如何在 Python (Flask) 应用程序中捕获 psycopg2.errors.UniqueViolation 错误?

我有一个使用 sqlalchemy 将数据保存到数据库的小型 Python Web 应用程序(用 Flask 编写)。当我尝试插入重复行时,会引发异常,如下所示:

(psycopg2.errors.UniqueViolation) duplicate key value violates unique constraint "uix_my_column"
Run Code Online (Sandbox Code Playgroud)

我想包装异常并重新引发我自己的异常,以便我可以添加我自己的特定于该特定错误的日志记录和消息传递。这是我尝试过的(简化):

from db import DbApi
from my_exceptions import BadRequest
from psycopg2.errors import UniqueViolation # <-- this does not exist!

class MyClass:
    def __init__(self):
        self.db = DbApi() 

    def create(self, data: dict) -> MyRecord:
        try:
            with self.db.session_local(expire_on_commit=False) as session:
                my_rec = MyRecord(**data)
                session.add(my_rec)
                session.commit()
                session.refresh(my_rec)
                return my_rec
        except UniqueViolation as e:
            raise BadRequest('A duplicate record already exists')
Run Code Online (Sandbox Code Playgroud)

但这无法捕获错误,因为psycopg2.errors.UniqueViolation它实际上不是类名 (!)。

在 PHP 中,这就像捕获复制/粘贴异常的类名一样简单,但在 Python 中,这更加模糊。 …

python sqlalchemy

30
推荐指数
4
解决办法
2万
查看次数

如何获取sqlalchemy中受影响的行数?

我有一个关于Python和sqlalchemy模块的问题.cursor.rowcountsqlalchemy Python中的等价物是什么?

python sqlalchemy

29
推荐指数
2
解决办法
1万
查看次数

SQLAlchemy ON DUPLICATE KEY UPDATE

INSERT ... ON DUPLICATE KEY UPDATE在SQLAlchemy中有一种优雅的方式吗?我的意思是语法类似的东西inserter.insert().execute(list_of_dictionaries)

python mysql sqlalchemy

29
推荐指数
2
解决办法
3万
查看次数

SQLAlchemy可以配置为非阻塞吗?

我的印象是,通过SQLAlchemy进行的数据库调用将阻塞,并且不适用于除同步代码之外的任何其他内容.我是否正确(我希望我不是!)或者有没有办法将其配置为非阻塞?

python database asynchronous sqlalchemy nonblocking

29
推荐指数
2
解决办法
1万
查看次数

SQLAlchemy:具有关系的混合表达式

我有两个Flask-SQLAlchemy模型,具有简单的一对多关系,如下面的最小示例:

class School(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(30))
    address = db.Column(db.String(30))

class Teacher(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(30))
    id_school = db.Column(db.Integer, db.ForeignKey(School.id))

    school = relationship('School', backref='teachers')
Run Code Online (Sandbox Code Playgroud)

然后我向使用该关系的教师添加混合属性,如:

@hybrid_property
def school_name(self):
    return self.school.name
Run Code Online (Sandbox Code Playgroud)

当我使用它时,该属性工作得很好teacher_instance.school_name.但是,我也想提出类似的查询Teacher.query.filter(Teacher.school_name == 'x'),但这给了我一个错误:

`AttributeError: Neither 'InstrumentedAttribute' object nor 
'Comparator' object has an attribute 'school_name'`. 
Run Code Online (Sandbox Code Playgroud)

在SQLAlchemy文档之后,我添加了一个简单的混合表达式,如下所示:

@school_name.expression
def school_name(cls):
    return School.name
Run Code Online (Sandbox Code Playgroud)

但是,当我再次尝试相同的查询时,它会生成一个没有join子句的SQL查询,因此我获得了School中所有可用的行,而不仅仅是那些与Teacher中的外键匹配的行.

从SQLAlchemy文档中我意识到表达式需要一个已经存在连接的上下文,所以我再次尝试查询:

Teacher.query.join(School).filter(Teacher.school_name == 'x')

这实际上是有效的,但是如果我需要学校模型的知识来实现​​这一目的,那就首先试图在那里试图获得语法糖.我希望有一种方法可以在表达式中加入,但我无法在任何地方找到它.该文档有一个示例,表达式返回一个直接用它构建的子查询select(),但即使这对我没用.

有任何想法吗?

UPDATE

在下面的Eevee回答之后,我使用了建议的关联代理并且它有效,但我也对它应该与select()子查询一起工作的评论感到好奇,并试图弄清楚我做错了什么.我最初的尝试是:

@school_name.expression
def school_name(cls):
    return select(School.name).where(cls.id_school == School.id).as_scalar() …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy flask-sqlalchemy

29
推荐指数
1
解决办法
7215
查看次数

检查.one()是否为空sqlAlchemy

我正在运行基于查询的其他ID的查询.我遇到的问题是,有时查询将找不到结果.而不是让整个程序崩溃,我如何检查结果是否为None?

这是我的查询:

sub_report_id = DBSession.query(TSubReport.ixSubReport).filter(and_(TSubReport.ixSection==sectionID[0], TSubReport.ixReport== reportID[0])).one()
Run Code Online (Sandbox Code Playgroud)

当代码执行并且没有找到结果时,我得到一个NoResultFound异常

NoResultFound: No row was found for one()
Run Code Online (Sandbox Code Playgroud)

如果没有结果,有没有办法跳过查询?

在SO上找到解决方案(之前找不到) 从sqlalchemy获取第一行

python sqlalchemy pyramid

29
推荐指数
3
解决办法
3万
查看次数

为什么Flask-migrate在drop column时无法升级

我正在使用SqlAlchemy和Flask-migrate进行数据库迁移.我已经成功init了DB和upgrade一次,但是当我删除了我的表列的一个,我设法migrate但是upgrade给了我以下错误:

sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) near "DROP": syntax error [SQL: u'ALTER TABLE posts DROP COLUMN tags']
Run Code Online (Sandbox Code Playgroud)

我的models.py有一部分

class Post(db.Model):
    __tabelname__ = 'posts'
    id = db.Column(db.Integer, primary_key=True)
    body = db.Column(db.UnicodeText)
    # tags = db.Column(db.Unicode(32))
    # I deleted this field, upgrade give me error

    ....
Run Code Online (Sandbox Code Playgroud)

然后我再次运行python manage.py db upgrade,错误改变了!

(venv)ncp@ubuntu:~/manualscore$ python manage.py db upgrade
INFO  [alembic.migration] Context impl SQLiteImpl.
INFO  [alembic.migration] Will assume non-transactional DDL.
INFO  [alembic.migration] Running upgrade 555b78ffd5f -> 2e063b1b3164, add tag …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy flask-migrate

29
推荐指数
3
解决办法
8463
查看次数