标签: sqlalchemy

捕获SQLAlchemy异常

什么是我可以捕获SQLAlechmy异常的上层异常?

>>> from sqlalchemy import exc
>>> dir(exc)
['ArgumentError', 'CircularDependencyError', 'CompileError', 'ConcurrentModificationError', 'DBAPIError', 'DataError', 'DatabaseError', 'DisconnectionError', 'FlushError', 'IdentifierError', 'IntegrityError', 'InterfaceError', 'InternalError', 'InvalidRequestError', 'NoReferenceError', 'NoReferencedColumnError', 'NoReferencedTableError', 'NoSuchColumnError', 'NoSuchTableError', 'NotSupportedError', 'OperationalError', 'ProgrammingError', 'SADeprecationWarning', 'SAPendingDeprecationWarning', 'SAWarning', 'SQLAlchemyError', 'SQLError', 'TimeoutError', 'UnboundExecutionError', 'UnmappedColumnError', '__builtins__', '__doc__', '__file__', '__name__', '__package__']
>>> 
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy exception

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

SQLAlchemy - 将自引用关系映射为一对多(声明形式)

我想使用声明方法和SQLAlchemy映射Tag实体.标签可以有父(另一个标签).

我有:

class Tag(Base):
    __tablename__ = 'tag'

    id = Column(Integer, primary_key=True)
    label = Column(String)

    def __init__(self, label, parentTag=None):
        self.label = label
Run Code Online (Sandbox Code Playgroud)

如何添加"父母"关系?

谢谢

python sqlalchemy

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

SQLAlchemy中的Model.query和session.query(Model)有什么区别?

我是SQLAlchemy的初学者,发现查询可以用2种方法完成:

方法1:

DBSession = scoped_session(sessionmaker())
class _Base(object):
    query = DBSession.query_property()

Base = declarative_base(cls=_Base)

class SomeModel(Base):
    key   = Column(Unicode, primary_key=True)
    value = Column(Unicode)

# When querying
result = SomeModel.query.filter(...)
Run Code Online (Sandbox Code Playgroud)

方法2

DBSession = scoped_session(sessionmaker())
Base = declarative_base()

class SomeModel(Base):
    key   = Column(Unicode, primary_key=True)
    value = Column(Unicode)

# When querying
session = DBSession()
result = session.query(SomeModel).filter(...)
Run Code Online (Sandbox Code Playgroud)

它们之间有什么区别吗?

python sqlalchemy

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

将LIMIT和OFFSET应用于SQLAlchemy中的所有查询

我正在使用SQLAlchemy(查询MySQL)设计API,我想强制所有查询都有page_size(LIMIT)和page_number(OFFSET)参数.

使用SQLAlchemy是否有一种干净的方法?也许构建某种工厂来创建自定义Query对象?或者也许有一个很好的方法来使用mixin类吗?

我尝试了显而易见的事情并且它不起作用,因为.limit()和.offset()必须在应用所有过滤条件后调用:

def q(page=0, page_size=None):
    q = session.query(...)
    if page_size: q = q.limit(page_size)
    if page: q = q.offset(page*page_size)
    return q
Run Code Online (Sandbox Code Playgroud)

当我尝试使用它时,我得到了例外:

sqlalchemy.exc.InvalidRequestError: Query.filter() being called on a Query which already has LIMIT or OFFSET applied. To modify the row-limited results of a  Query, call from_self() first.  Otherwise, call filter() before limit() or offset() are applied.
Run Code Online (Sandbox Code Playgroud)

python api-design sqlalchemy

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

为什么SQLAlchemy count()比原始查询慢得多?

我正在使用带有MySQL数据库的SQLAlchemy,我想计算表中的行数(大约300k).SQLAlchemy 计数函数的运行时间大约是在MySQL中直接写入相同查询的50倍.难道我做错了什么?

# this takes over 3 seconds to return
session.query(Segment).count()
Run Code Online (Sandbox Code Playgroud)

然而:

SELECT COUNT(*) FROM segments;
+----------+
| COUNT(*) |
+----------+
|   281992 |
+----------+
1 row in set (0.07 sec)
Run Code Online (Sandbox Code Playgroud)

速度的差异随着桌子的大小而增加(在100k行下几乎不可察觉).

更新

使用session.query(Segment.id).count()而不是session.query(Segment).count()似乎做的伎俩,让它加快速度.我仍然感到困惑,为什么初始查询速度较慢.

mysql sqlalchemy

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

在SQLAlchemy中将类映射到多个表

# ! /usr/bin/env python
# -*- coding: utf-8 -*-
# login_frontend.py

""" Python        2.7.3
    Cherrypy      3.2.2
    PostgreSQL    9.1
    psycopy2      2.4.5
    SQLAlchemy    0.7.10
"""
Run Code Online (Sandbox Code Playgroud)

我在一个Python/SQLAlchemy类中连接四个表时遇到问题.我正在尝试这个,所以我可以迭代这个类的实例,而不是我从连接ORM表中得到的命名元组.

为什么这一切?因为我已经开始这样了,而且我走得太远,只是离开它.此外,它必须是可能的,所以我想知道它是如何完成的.

对于这个项目(cherrypy web-frontend),我得到了一个已经完成的包含表类的模块.我把它移到了这篇文章的底部,因为也许你甚至都不需要它.

以下只是联接多表类尝试的一个示例.我选择了一个简单的案例,其中只有两个表和一个联结表.在这里,我不会写入这些连接表,但它在其他地方是必要的.这就是为什么类可以很好地解决这个问题.


我尝试加入课程,

这是给定的表类模块和这两个网站的示例的组合:

- 针对多个表映射类
- SQLAlchemy:一个类 - 两个表

class JoinUserGroupPerson (Base):

    persons = md.tables['persons']
    users = md.tables['users']
    user_groups = md.tables['user_groups']
    groups = md.tables['groups']

    user_group_person =(
        join(persons, users, persons.c.id == users.c.id).
        join(user_groups, users.c.id == user_groups.c.user_id).
        join(groups, groups.c.id == user_groups.c.group_id))

    __table__ = user_group_person

    """ I expanded the redefinition of 'id' to three tables,
        and …
Run Code Online (Sandbox Code Playgroud)

python mapping orm sqlalchemy cherrypy

38
推荐指数
1
解决办法
3604
查看次数

SQLAlchemy没有提供密码错误

这可能是一个愚蠢的错误,但我似乎找不到令人满意的解决方案.

运行时db.create_all(),我收到以下错误.

sqlalchemy.exc.OperationalError: (OperationalError) fe_sendauth: no password supplied  None None
Run Code Online (Sandbox Code Playgroud)

我的数据库链接设置为

'postgresql://localhost/db_name'
Run Code Online (Sandbox Code Playgroud)

这在我的Mac和Heroku上工作正常,但在ubuntu(digitalocean)上不行.

我有什么想法可能做错了吗?

postgresql sqlalchemy

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

如何在SqlAlchemy中执行"左外连接"

我需要执行这个查询::

select field11, field12
from Table_1 t1
left outer join Table_2 t2 ON t2.tbl1_id = t1.tbl1_id
where t2.tbl2_id is null
Run Code Online (Sandbox Code Playgroud)

我在python中有这些类:

class Table1(Base):
   ....

class Table2(Base):
   table_id =  Column(
        Integer,
        ForeignKey('Table1.id', ondelete='CASCADE'),
    )
    ....
Run Code Online (Sandbox Code Playgroud)

我如何从下面得到上述内容?

python sql sqlalchemy

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

在sqlalchemy中插入具有一对多关系的新记录

我正在遵循flask-sqlalchemy教程,宣布关于一对多关系的模型.示例代码如下:

class Person(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))
    addresses = db.relationship('Address', backref='person',
                                lazy='dynamic')

class Address(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(50))
    person_id = db.Column(db.Integer, db.ForeignKey('person.id'))
Run Code Online (Sandbox Code Playgroud)

现在我想知道如何使用这样的模型将新记录插入到DB中.我假设我需要一个构造函数init,但我很难理解它应该如何实现和使用.我这里的主要问题是Person依赖于地址和地址有ForeignKey to Person,所以它应该提前知道Person.

Plase帮助我理解它应该如何执行.

先感谢您.

python sqlalchemy foreign-keys relationship flask-sqlalchemy

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

如何删除SQLAlchemy中的表?

我想使用SQLAlchemy删除一个表.

由于我一遍又一遍地测试,我想删除表,my_users以便每次都可以从头开始.

到目前为止,我使用SQLAlchemy通过engine.execute()方法执行原始SQL :

sql = text('DROP TABLE IF EXISTS my_users;')
result = engine.execute(sql)
Run Code Online (Sandbox Code Playgroud)

但是,我想知道是否有一些标准的方法可以这样做.我唯一能找到的是drop_all(),但它删除了所有结构,而不仅仅是一个特定的表:

Base.metadata.drop_all(engine)   # all tables are deleted
Run Code Online (Sandbox Code Playgroud)

例如,给出这个非常基本的例子.它包含一个带有单个表的SQLite基础结构my_users,我在其中添加了一些内容.

from sqlalchemy import create_engine, Column, Integer, String, text
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

engine = create_engine('sqlite://', echo=False)
Base = declarative_base()

class User(Base):
    __tablename__ = "my_users"

    id = Column(Integer, primary_key=True)
    name = Column(String)

    def __init__(self, name):
        self.name = name

# Create all the tables in the database which …
Run Code Online (Sandbox Code Playgroud)

python sqlite sqlalchemy drop-table

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