标签: sqlalchemy

SQLAlchemy - 从dict动态构建查询过滤器

所以我从网页上传了一个字典.我想基于dict动态构建查询.我知道我能做到:

session.query(myClass).filter_by(**web_dict)
Run Code Online (Sandbox Code Playgroud)

但是,仅当值完全匹配时才有效.我需要'喜欢'过滤.我最好的尝试使用__dict__属性:

for k,v in web_dict.items():
    q = session.query(myClass).filter(myClass.__dict__[k].like('%%%s%%' % v))
Run Code Online (Sandbox Code Playgroud)

不知道如何从那里构建查询.任何帮助都是极好的.

python sqlalchemy

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

Sqlite/SQLAlchemy:如何强制执行外键?

新版本的SQLite能够强制执行外键约束,但为了向后兼容,您必须分别为每个数据库连接打开它!

sqlite> PRAGMA foreign_keys = ON;
Run Code Online (Sandbox Code Playgroud)

我正在使用SQLAlchemy - 我怎样才能确保它始终打开?我试过的是这个:

engine = sqlalchemy.create_engine('sqlite:///:memory:', echo=True)
engine.execute('pragma foreign_keys=on')
Run Code Online (Sandbox Code Playgroud)

......但它不起作用!...我错过了什么?

编辑: 我认为我的真正问题是我安装了多个版本的SQLite,并且Python没有使用最新的版本!

>>> import sqlite3
>>> print sqlite3.sqlite_version
3.3.4
Run Code Online (Sandbox Code Playgroud)

但我刚刚下载了3.6.23并将exe放在我的项目目录中!我怎样才能弄清楚它正在使用哪个.exe并进行更改?

python sqlite sqlalchemy foreign-keys

32
推荐指数
6
解决办法
1万
查看次数

如何从SQLAlchemy结果中获取列名(声明性语法)

我正在金字塔项目中工作,我在SQLAlchemy中使用声明性语法表

"""models.py"""
class Projects(Base):
    __tablename__ = 'projects'
    __table_args__ = {'autoload': True}
Run Code Online (Sandbox Code Playgroud)

我通过使用获得结果

""""views.py"""
session = DBSession()
row_data = session.query(Projects).filter_by(id=1).one()
Run Code Online (Sandbox Code Playgroud)

如何从此结果中获取列名称.

PS:我无法使用方法,因为我使用的是声明性语法.

python pylons sqlalchemy pyramid

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

在SQLAlchemy中动态构建过滤器

我正在寻找一种使用SQLAlchemy动态构造过滤器的方法.也就是说,给定列,运算符名称和比较值,构造相应的过滤器.

我将尝试使用示例进行说明(这将用于构建API).假设我们有以下型号:

class Cat(Model):

  id = Column(Integer, primary_key=True)
  name = Column(String)
  age = Column(Integer)
Run Code Online (Sandbox Code Playgroud)

我想将查询映射到过滤器.例如,

  • /cats?filter=age;eq;3 应该生成 Cat.query.filter(Cat.age == 3)

  • /cats?filter=age;in;5,6,7&filter=id;ge;10 应该生成 Cat.query.filter(Cat.age.in_([5, 6, 7])).filter(Cat.id >= 10)

我环顾四周看看它是如何完成的,但找不到一种方法,不涉及手动将每个操作符名称映射到比较器或类似的东西.例如,Flask-Restless保存所有支持操作的字典并存储相应的lambda函数(此处为代码).

我在SQLAlchemy文档中搜索并发现了两个潜在的潜在客户,但似乎都不满意:

  • 使用Column.like,Column.in_...:这些运营商都可以直接在列这将使其简单的使用getattr,但一些人仍下落不明(==,>,等).

  • 使用Column.op:例如,Cat.name.op('=')('Hobbes')但这似乎并不适用于所有运营商(in即).

有没有lambda功能的干净方法吗?

python sqlalchemy

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

SQLAlchemy计算列

(新的SQLAlchemy用户警报)我有三个表:一个人,从特定日期开始的人每小时费率和每日时间报告.我正在寻找正确的方法,以便在当天的人员每小时费率中扣除时间费用.

是的,我可以在创建时计算该值,并将其作为模型的一部分,但请将此视为总结幕后更复杂数据的示例.我如何计算Time.cost?它是hybrid_propery,column_property还是完全不同的东西?

class Person(Base):
    __tablename__ = 'person'
    personID = Column(Integer, primary_key=True)
    name = Column(String(30), unique=True)

class Payrate(Base):
    __tablename__ = 'payrate'
    payrateID = Column(Integer, primary_key=True)
    personID  = Column(Integer, ForeignKey('person.personID'))
    hourly    = Column(Integer)
    starting  = Column(Date)
    __tableargs__ =(UniqueConstraint('personID', 'starting',
                                     name='uc_peron_starting'))

class Time(Base):
    __tablename__ = 'entry'
    entryID  = Column(Integer, primary_key=True)
    personID = Column(Integer, ForeignKey('person.personID'))
    workedon = Column(Date)
    hours    = Column(Integer)

    person = relationship("Person")

    def __repr__(self):
        return "<{date} {hours}hrs ${0.cost:.02f}>".format(self, 
                      date=self.workedon.isoformat(), hours=to_hours(self.hours))

    @property
    def cost(self):
        '''Cost of entry
        '''
        ## This is where I …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy calculated-columns

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

sqlalchemy外键关系属性

我有一个User表和一个Friend表.Friend表包含两个外键,包括我的User表和状态字段.我试图能够在Friend对象上调用我的User表中的属性.例如,我希望能够做一些像friend.name或friend.email这样的事情.

class User(Base):
    """ Holds user info """

    __tablename__ = 'user'
    id = Column(Integer, primary_key=True)
    name = Column(String(25), unique=True)
    email = Column(String(50), unique=True)
    password = Column(String(25))
    admin = Column(Boolean)

    # relationships
    friends = relationship('Friend', backref='Friend.friend_id',primaryjoin='User.id==Friend.user_id', lazy='dynamic')

class Friend(Base):
    __tablename__ = 'friend'

    user_id = Column(Integer, ForeignKey(User.id), primary_key=True)
    friend_id = Column(Integer, ForeignKey(User.id), primary_key=True)
    request_status = Column(Boolean)
Run Code Online (Sandbox Code Playgroud)

当我获得friend对象时我只有2 user_ids并且我希望显示每个用户的所有属性,以便我可以在表单等中使用该信息.我是sqlalchemy的新手 - 仍在尝试学习更多高级功能.这只是一个较大的Flask项目的片段,这个功能将用于friend请求等.我试图查找关联对象等,但我很难用它.

任何帮助将不胜感激.

python sqlalchemy flask-sqlalchemy

32
推荐指数
1
解决办法
4万
查看次数

sqlalchemy,选择所有行

我试图从表中获取所有行.

在控制器我有:

meta.Session.query(User).all()
Run Code Online (Sandbox Code Playgroud)

结果是[, ],但我在这个表中有2行.

我在表中使用这个模型:

import hashlib
import sqlalchemy as sa
from sqlalchemy import orm

from allsun.model import meta

t_user =  sa.Table("users",meta.metadata,autoload=True)

class Duplicat(Exception):
    pass
class LoginExistsException(Exception):
    pass
class EmailExistsException(Exception):
    pass
Run Code Online (Sandbox Code Playgroud)

接下来,在同一个文件中:

class User(object):
    def loginExists(self):
        try:
            meta.Session
                .query(User)
                .filter(User.login==self.login)
                .one()
        except orm.exc.NoResultFound:
            pass
        else:
            raise LoginExistsException()

    def emailExists(self):
        try:
            meta
                .Session
                .query(User)
                .filter(User.email==self.email)
                .one()
        except orm.exc.NoResultFound:
            pass
        else:
            raise EmailExistsException()


    def save(self):
        meta.Session.begin()
        meta.Session.save(self)
        try:
            meta.Session.commit()
        except sa.exc.IntegrityError:
            raise Duplicat()

orm.mapper(User, t_user)
Run Code Online (Sandbox Code Playgroud)

........

python pylons sqlalchemy

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

Twisted + SQLAlchemy以及最好的方法

所以我正在编写另一个基于Twisted的守护进程.它将像往常一样有一个xmlrpc接口,因此我可以轻松地与它进行通信,并让其他进程根据需要与它交换数据.

该守护进程需要访问数据库.我们一直在使用SQL Alchemy代替我们最新项目的硬编码SQL字符串 - 这些项目主要用于Pylons中的Web应用程序.

我们想对这个应用程序做同样的事情并重新使用利用SQL Alchemy的库代码.那么该怎么办?当然,因为该库是为Pylons应用程序编写的,所以每个人都习惯使用的所有直接阻塞样式代码,所有非阻塞都由Pylons通过线程,线程本地,范围会话等神奇地处理.上.

所以现在对Twisted我想我有点卡住了.我可以:

  1. 如果它是最小的,请直接编写我需要的sql,并在我需要命中db时使用twisted中的dbapi池来执行runInteractions等.
  2. 在我们的库中使用对象和固有的阻塞方法,然后在我的Twisted守护进程中阻塞.呸.
  3. 使用2008年最后一次更新的sAsync,并重用我们已经定义的模型但不是真的,这并不能解决库代码也需要在Pylons中工作的问题.这甚至适用于最新版本的SQL Alchemy吗?谁知道.那个项目看起来很棒 - 它为什么显然被抛弃了?
  4. 生成一个单独的子进程并让它处理库代码及其所有阻塞,结果返回到我的守护进程准备好后作为通过YAML通过xmlrpc编组的对象.
  5. 使用deferToThread,然后删除返回的对象,确保执行急切的加载,以便我拥有我可能需要的所有东西.对我来说似乎有些丑陋.

我也坚持使用Python 2.5.4 atm所以还没有2.6,我不认为我可以从未来进行导入以获得那里很酷的新多处理模块的东西.虽然我认为我们已经很好地处理了进程间通信,但这没关系.

所以我倾向于选项4,因为这样可以避免与选项1的逻辑重复的致命罪,同时也避免线程.

我的第一次尝试将是选项2,只是让事情继续进行,然后将对库代码的调用分离出来,如果它看起来好像很可能需要花费太长时间才能阻塞.伤心.也许Stackless Python和Twisted的组合在这里会很有趣.

有更好的想法吗?

python sql database sqlalchemy twisted

31
推荐指数
3
解决办法
8325
查看次数

Alembic:使用USING改变列类型

我正在尝试使用alembic将SQLAlchemy PostgreSQL ARRAY(文本)字段转换为我的一个表列的BIT(vary = True)字段.

该列目前定义为:

cols = Column(ARRAY(TEXT), nullable=False, index=True)
Run Code Online (Sandbox Code Playgroud)

我想将其更改为:

cols = Column(BIT(varying=True), nullable=False, index=True)
Run Code Online (Sandbox Code Playgroud)

默认情况下似乎不支持更改列类型,因此我手动编辑了alembic脚本.这就是我目前所拥有的:

def upgrade():
    op.alter_column(
        table_name='views',
        column_name='cols',
        nullable=False,
        type_=postgresql.BIT(varying=True)
    )


def downgrade():
    op.alter_column(
        table_name='views',
        column_name='cols',
        nullable=False,
        type_=postgresql.ARRAY(sa.Text())
    )
Run Code Online (Sandbox Code Playgroud)

但是,运行此脚本会出现错误:

Traceback (most recent call last):
  File "/home/home/.virtualenvs/deus_lex/bin/alembic", line 9, in <module>
    load_entry_point('alembic==0.7.4', 'console_scripts', 'alembic')()
  File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/alembic/config.py", line 399, in main
    CommandLine(prog=prog).main(argv=argv)
  File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/alembic/config.py", line 393, in main
    self.run_cmd(cfg, options)
  File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/alembic/config.py", line 376, in run_cmd
    **dict((k, getattr(options, k)) for k in kwarg)
  File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/alembic/command.py", line …
Run Code Online (Sandbox Code Playgroud)

postgresql sqlalchemy alembic

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

使用Python枚举定义SQLAlchemy枚举列会引发"ValueError:not a enum"

我试图按照这个例子在一个使用Python Enum类型的表中有一个枚举列.我定义了枚举,然后将其传递给列,如示例所示,但我明白了ValueError: <enum 'FruitType'> is not a valid Enum.如何使用Python枚举正确定义SQLAlchemy枚举列?

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import enum

app = Flask(__name__)
db = SQLAlchemy(app)

class FruitType(enum.Enum):
    APPLE = "Crunchy apple"
    BANANA = "Sweet banana"

class MyTable(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    fruit_type = db.Column(enum.Enum(FruitType))
Run Code Online (Sandbox Code Playgroud)
File "why.py", line 32, in <module>
    class MyTable(db.Model):
  File "why.py", line 34, in MyTable
    fruit_type = db.Column(enum.Enum(FruitType))
  File "/usr/lib/python2.7/dist-packages/enum/__init__.py", line 330, in __call__
    return cls.__new__(cls, value)
  File "/usr/lib/python2.7/dist-packages/enum/__init__.py", line …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy flask flask-sqlalchemy

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