标签: sqlalchemy

SQLAlchemy:打印实际查询

我真的希望能够为我的应用程序打印出有效的SQL,包括值,而不是绑定参数,但是在SQLAlchemy中如何做到这一点并不明显(按照设计,我很确定).

有没有人以一般方式解决这个问题?

python sqlalchemy

140
推荐指数
8
解决办法
8万
查看次数

SQLAlchemy默认DateTime

这是我的声明模型:

import datetime
from sqlalchemy import Column, Integer, DateTime
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class Test(Base):
    __tablename__ = 'test'

    id = Column(Integer, primary_key=True)
    created_date = DateTime(default=datetime.datetime.utcnow)
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试导入此模块时,我收到此错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "orm/models2.py", line 37, in <module>
    class Test(Base):
  File "orm/models2.py", line 41, in Test
    created_date = sqlalchemy.DateTime(default=datetime.datetime.utcnow)
TypeError: __init__() got an unexpected keyword argument 'default'
Run Code Online (Sandbox Code Playgroud)

如果我使用Integer类型,我可以设置默认值.这是怎么回事?

python sqlalchemy date

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

奇怪的SQLAlchemy错误消息:TypeError:'dict'对象不支持索引

我使用手工制作的SQL来使用SqlAlchemy从PG数据库中获取数据.我正在尝试一个包含SQL运算符'%'的查询,并且似乎通过循环抛出SqlAlcjhemy:

sql = """
       SELECT DISTINCT u.name from user u
        INNER JOIN city c ON u.city_id = c.id
        WHERE c.designation=upper('fantasy') 
        AND c.id IN (select id from ref_geog where short_name LIKE '%opt')
      """

# The last line in the above statement throws the error mentioned in the title. 
# However if the last line is change to:
# AND c.id IN (select id from ref_geog where short_name = 'helloopt')
# the script runs correctly.
#
# I also tried double escaping …
Run Code Online (Sandbox Code Playgroud)

python postgresql sqlalchemy

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

我怎么知道我是否可以禁用SQLALCHEMY_TRACK_MODIFICATIONS?

每次我运行使用Flask-SQLAlchemy的应用程序时,都会收到以下警告:该SQLALCHEMY_TRACK_MODIFICATIONS选项将被禁用.

/home/david/.virtualenvs/flask-sqlalchemy/lib/python3.5/site-packages/flask_sqlalchemy/__init__.py:800: UserWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True to suppress this warning.
  warnings.warn('SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True to suppress this warning.')
Run Code Online (Sandbox Code Playgroud)

我试图找出这个选项的作用,但Flask-SQLAlchemy文档并不清楚使用此跟踪的内容.

SQLALCHEMY_TRACK_MODIFICATIONS

如果设置为True(默认值),Flask-SQLAlchemy将跟踪对象的修改并发出信号.这需要额外的内存,如果不需要可以禁用.

如何确定我的项目是否需要,SQLALCHEMY_TRACK_MODIFICATIONS = True或者我是否可以安全地禁用此功能并在我的服务器上保存内存?

python sqlalchemy flask flask-sqlalchemy

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

jsonify在Flask中的SQLAlchemy结果集

我正在尝试在Flask/Python中jsonify一个SQLAlchemy结果集.

Flask邮件列表建议采用以下方法:http://librelist.com/browser//flask/2011/2/16/jsonify-sqlalchemy-pagination-collection-result/#04a0754b63387f87e59dda564bde426e:

return jsonify(json_list = qryresult)
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:

TypeError: <flaskext.sqlalchemy.BaseQuery object at 0x102c2df90> 
is not JSON serializable
Run Code Online (Sandbox Code Playgroud)

我在这里俯瞰什么?

我发现了这个问题:如何将SqlAlchemy结果序列化为JSON?这看起来非常相似但是我不知道Flask是否有一些魔力使其更容易,如邮件列表帖子所示.

编辑:为了澄清,这就是我的模型

class Rating(db.Model):

    __tablename__ = 'rating'

    id = db.Column(db.Integer, primary_key=True)
    fullurl = db.Column(db.String())
    url = db.Column(db.String())
    comments = db.Column(db.Text)
    overall = db.Column(db.Integer)
    shipping = db.Column(db.Integer)
    cost = db.Column(db.Integer)
    honesty = db.Column(db.Integer)
    communication = db.Column(db.Integer)
    name = db.Column(db.String())
    ipaddr = db.Column(db.String())
    date = db.Column(db.String())

    def __init__(self, fullurl, url, comments, overall, shipping, cost, honesty, communication, name, ipaddr, date): …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy flask flask-sqlalchemy

112
推荐指数
7
解决办法
11万
查看次数

如何更新SQLAlchemy行条目?

假设表有三列:username,passwordno_of_logins.

当用户尝试登录时,会检查具有类似查询的条目

user = User.query.filter_by(username=form.username.data).first()
Run Code Online (Sandbox Code Playgroud)

如果密码匹配,他继续前进.我想要做的是计算用户登录的次数.因此,每当他成功登录时,我想增加该no_of_logins字段并将其存储回用户表.我不知道如何使用SqlAlchemy运行更新查询.

python sqlalchemy flask-sqlalchemy

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

SQLAlchemy版本控制关注类导入顺序

我在这里关注指南:

http://www.sqlalchemy.org/docs/orm/examples.html?highlight=versioning#versioned-objects

并遇到了一个问题.我已经定义了我的关系:

generic_ticker = relation('MyClass', backref=backref("stuffs"))
Run Code Online (Sandbox Code Playgroud)

使用字符串,因此它不关心我的模型模块的导入顺序.这一切都正常,但是当我使用版本控制元时,我收到以下错误:

sqlalchemy.exc.InvalidRequestError:初始化映射器Mapper | MyClass | stuffs时,表达式"Trader"找不到名称("name'MyClass'未定义").如果这是类名,请考虑在定义了两个依赖类之后将此关系()添加到类中.

我将错误追踪到:

  File "/home/nick/workspace/gm3/gm3/lib/history_meta.py", line 90, in __init__
    mapper = class_mapper(cls)
  File "/home/nick/venv/tg2env/lib/python2.6/site-packages/sqlalchemy/orm/util.py", line 622, in class_mapper
    mapper = mapper.compile()
Run Code Online (Sandbox Code Playgroud)
class VersionedMeta(DeclarativeMeta):
    def __init__(cls, classname, bases, dict_):
        DeclarativeMeta.__init__(cls, classname, bases, dict_)

        try:
            mapper = class_mapper(cls)
            _history_mapper(mapper)
        except UnmappedClassError:
            pass
Run Code Online (Sandbox Code Playgroud)

我通过将try:除了lambda中的东西并在所有导入发生之后运行它们来修复问题.这有效,但似乎有点垃圾,任何想法如何解决这个是一个更好的方法?

谢谢!

更新

问题实际上不是关于进口订单.版本控制示例的设计使得映射器需要在每个版本化类的costructor中进行编译.当相关类尚未定义时,编译失败.在循环关系的情况下,无法通过更改映射类的定义顺序使其工作.

更新2

正如上面的更新所述(我不知道你可以在这里编辑其他人的帖子:))这可能是由于循环引用.在这种情况下可能有人会发现我的hack有用(我正在使用它与turbogears)(替换VersionedMeta并在history_meta中添加create_mappers全局)

create_mappers = []
class VersionedMeta(DeclarativeMeta):
    def __init__(cls, classname, bases, dict_):
        DeclarativeMeta.__init__(cls, classname, bases, dict_)
        #I added this code in as it was crashing …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy

110
推荐指数
1
解决办法
6279
查看次数

使用SQLAlchemy ORM有效地更新数据库

我正在开始一个新的应用程序,并考虑使用ORM - 特别是SQLAlchemy.

假设我的数据库中有一个列'foo',我想增加它.在直接的sqlite中,这很容易:

db = sqlite3.connect('mydata.sqlitedb')
cur = db.cursor()
cur.execute('update table stuff set foo = foo + 1')
Run Code Online (Sandbox Code Playgroud)

我想出了SQLAlchemy SQL-builder的等价物:

engine = sqlalchemy.create_engine('sqlite:///mydata.sqlitedb')
md = sqlalchemy.MetaData(engine)
table = sqlalchemy.Table('stuff', md, autoload=True)
upd = table.update(values={table.c.foo:table.c.foo+1})
engine.execute(upd)
Run Code Online (Sandbox Code Playgroud)

这稍微慢一点,但其中并不多.

这是我对SQLAlchemy ORM方法的最佳猜测:

# snip definition of Stuff class made using declarative_base
# snip creation of session object
for c in session.query(Stuff):
    c.foo = c.foo + 1
session.flush()
session.commit()
Run Code Online (Sandbox Code Playgroud)

这是正确的,但它只需要不到其他两个方法的五十倍.我认为这是因为它必须将所有数据带入内存才能使用它.

有没有办法使用SQLAlchemy的ORM生成有效的SQL?或者使用任何其他python ORM?或者我应该回去手工编写SQL?

python orm sqlalchemy

107
推荐指数
4
解决办法
14万
查看次数

ImportError:没有名为MySQLdb的模块

我指的是以下教程,为我的Web应用程序创建一个登录页面. http://code.tutsplus.com/tutorials/intro-to-flask-signing-in-and-out--net-29982

我遇到了数据库问题.我得到了一个

ImportError: No module named MySQLdb
Run Code Online (Sandbox Code Playgroud)

当我执行

http://127.0.0.1:5000/testdb
Run Code Online (Sandbox Code Playgroud)

我已经尝试了所有可能的方法来安装python mysql,教程中提到的一个,easy_install,sudo apt-get install.

我在我的虚拟环境中安装了mysql.我的目录结构与本教程中解释的相同.该模块已成功安装在我的系统中,但仍然出现此错误.

请帮忙.可能导致这种情况的原因.

python mysql sqlalchemy mysql-python flask

105
推荐指数
8
解决办法
19万
查看次数

使用SQLAlchemy ORM批量插入

有没有办法让SQLAlchemy进行批量插入而不是插入每个单独的对象.即

这样做的:

INSERT INTO `foo` (`bar`) VALUES (1), (2), (3)
Run Code Online (Sandbox Code Playgroud)

而不是:

INSERT INTO `foo` (`bar`) VALUES (1)
INSERT INTO `foo` (`bar`) VALUES (2)
INSERT INTO `foo` (`bar`) VALUES (3)
Run Code Online (Sandbox Code Playgroud)

我刚刚转换了一些代码来使用sqlalchemy而不是原始的sql,虽然它现在更好用,但它现在看起来更慢(高达10倍),我想知道这是否是原因.

也许我可以更有效地使用会话来改善这种情况.在我添加了一些东西之后,我autoCommit=False现在做了一件事session.commit().虽然这似乎导致数据在其他地方更改数据库时变得陈旧,即使我做了一个新的查询,我仍然会得到旧的结果?

谢谢你的帮助!

python mysql database orm sqlalchemy

104
推荐指数
9
解决办法
9万
查看次数