在我使用SQLAlchemy和Elixir编写的一个小脚本中,我需要获取特定列的所有不同值.在普通的SQL中,它只是一个简单的问题
SELECT DISTINCT `column` FROM `table`;
Run Code Online (Sandbox Code Playgroud)
我知道我可以"手动"运行该查询,但如果可以,我宁愿坚持使用SQLAlchemy声明性语法(和/或Elixir).我确信它一定是可能的,我甚至在SQLAlchemy文档中看到过这种类似的暗示,但我一直在寻找这些文档几个小时(以及Elixir的文档),我就是不能似乎真的弄清楚它将如何完成.那我错过了什么?
出于某种原因,我想以csv文件的形式从数据库(sqlite3)转储表.我正在使用带有elixir的python脚本(基于sqlalchemy)来修改数据库.我想知道是否有任何方法可以将我使用的表转储到csv.
我见过sqlalchemy 序列化器,但它似乎不是我想要的.我做错了吗?我应该在关闭sqlalchemy会话后调用sqlite3 python模块转储到文件吗?或者我应该使用自制的东西?
我创建了一个python应用程序,它使用elixir/sqlalchemy来存储数据.软件的第二个版本要求更新在先前版本中创建的任何文件,以便添加/删除表和列.
我的问题是:我怎样才能做到这一点?我知道sqlalchemy-migrate,但我必须说我发现它令人困惑.它没有提到现有数据会发生什么.此外,sqlite 减少了ALTER TABLE支持,因此如果我尝试删除列,将会迁移什么?有没有其他方法可以使用迁移?
我已经使用SQLObject很长一段时间了,但是注意到SQLAlchemy在过去几年中变得更受欢迎:http://www.google.com/trends? q = sqlobject,+ sqlalchemy
是否有令人信服的理由切换到SQLAlchemy?它的性能相对于SQLObject如何?它的可用性?使用Elixir会增加性能开销是多少?
我的需求是基本的,简单的CRUD.没有异国情调.
我已经看到了这个相关的问题,但它是在1年多前被问过并没有太多回应.
我是从Elixir和SQL Alchemy开始的.我已经创建了一个连接Mysql数据库的python文件但是只要我用python执行,我就会得到错误:
root@raspberrypi:/Python/mainFlask/yonkiPOPS# python yonki.py
Traceback (most recent call last):
File "yonki.py", line 1, in <module>
from elixir import metadata, Entity, Field
File "/usr/local/lib/python2.7/dist-packages/Elixir-0.7.1-py2.7.egg/elixir/__init__.py", line 29, in <module>
from elixir.entity import Entity, EntityBase, EntityMeta, EntityDescriptor, \
File "/usr/local/lib/python2.7/dist-packages/Elixir-0.7.1-py2.7.egg/elixir/entity.py", line 17, in <module>
from sqlalchemy.orm import MapperExtension, mapper, object_session, \
ImportError: cannot import name ScopedSession
Run Code Online (Sandbox Code Playgroud)
我一直在寻找它,但我找不到原因.这是yonki.py文件:
from elixir import metadata, Entity, Field
from elixir import Unicode, UnicodeText
from elixir import *
class User(Entity):
username = Field(String(64))
metadata.bind = 'mysql://root:nomasandroid42@localhost/yonkiPOPS'
session.bind.echo = …Run Code Online (Sandbox Code Playgroud) 我做了一些测试并证明使用checkout事件处理程序检查断开连接是否与Elixir一起使用.开始认为我的问题与更新:我只是通过调用session.commit()从子进程调用有关?session.commit()下面的子进程,更新示例来反驳自己.我正在使用多处理模块来创建子流程.
这是代码,显示它应该如何工作(甚至没有使用pool_recycle!):
from sqlalchemy import exc
from sqlalchemy import event
from sqlalchemy.pool import Pool
from elixir import *
import multiprocessing as mp
class SubProcess(mp.Process):
def run(self):
a3 = TestModel(name="monkey")
session.commit()
class TestModel(Entity):
name = Field(String(255))
@event.listens_for(Pool, "checkout")
def ping_connection(dbapi_connection, connection_record, connection_proxy):
cursor = dbapi_connection.cursor()
try:
cursor.execute("SELECT 1")
except:
# optional - dispose the whole pool
# instead of invalidating one at a time
# connection_proxy._pool.dispose()
# raise DisconnectionError - pool will …Run Code Online (Sandbox Code Playgroud) python sqlalchemy multiprocessing mysql-python python-elixir
我想将Pylons与Elixir一起使用,但是,我不确定这样做的最佳方法是什么.有几个博客文章(cleverdevil,beachcoder,adam hoscilo),甚至还有一个关于如何做到这一点的全新框架 ; 但是,我不确定它们之间的区别.哪一个最好用?我是否会遇到使用其中一个的问题?
我宁愿不要直接使用SQLAlchemy,因为它的冗长和重复性.
我不确定scoped_session是如何工作的,除了它似乎是一个隐藏几个真实会话的包装器,使它们分开以满足不同的请求.它是否与线程本地人一起使用?
无论如何麻烦如下:
S = elixir.session # = scoped_session(...)
f = Foo(bar=1)
S.add(f) # ERROR, f is already attached to session (different session)
Run Code Online (Sandbox Code Playgroud)
不确定f在不同的会话中是如何结束的,我之前没有遇到任何问题.在其他地方,我的代码看起来就像那样,但实际上是有效的.你可以想象我发现这很令人困惑.
我在这里什么都不知道,f似乎神奇地添加到构造函数中的一个会话中,但我似乎没有对它使用的会话有任何引用.为什么它会在不同的会话中结束?我怎样才能让它在正确的会话中结束?这个scoped_session的东西怎么样?它有时似乎有效,有时则不然.
我当然很困惑.
python ×10
python-elixir ×10
sqlalchemy ×10
csv ×1
database ×1
mysql ×1
mysql-python ×1
pylons ×1
sql ×1
sqlobject ×1