当我创建一个带有自动递增主键的表时,是否有办法获得主键(即保留主键)而不实际提交?
我想在事务中放置两个操作,但其中一个操作将取决于在上一个操作中分配了哪个主键.
我正在尝试使用SQLAlchemy进行Pylons,我喜欢它,只有一件事,是否可以在执行之前打印出从Table().create()生成的原始SQL CREATE TABLE数据?
你如何处理SQLAlchemy中的错误?我对SQLAlchemy比较新,还不知道.
在我使用SQLAlchemy之前,我会做类似的事情
status = db.query("INSERT INTO users ...")
if (!status):
raise Error, db.error
Run Code Online (Sandbox Code Playgroud)
但是现在我在SQLAlchemy编写代码并且我做了类似的事情
user = User('Boda Cydo')
session.add(user)
session.commit()
Run Code Online (Sandbox Code Playgroud)
没有任何错误检查!
我根本不喜欢这种编码风格而没有错误检查.
请咨询如何检查和处理SQLAlchemy中的错误!
真诚的,Boda Cydo.
我目前正在开发一个基于的应用程序flask.它运行良好,可以手动生成服务器app.run().我已经尝试过mod_wsgi了.奇怪的是,我得到500错误,日志中没有任何内容.我调查了一下,这是我的发现.
print >>sys.stderr, "hello"预期的那样插入一行.该消息显示在错误日志中.我的直觉告诉我,SQLAlchemy会发出错误,也许某些日志配置会导致日志在应用程序的某个时刻被丢弃.
另外,为了测试,我使用的是SQLite.据我所知,这只能从一个线程访问.因此,如果mod_wsgi生成更多线程,它可能会破坏应用程序.
我有点不知所措,因为它只会打破后面的运行mod_wsgi,这似乎也吞噬了我的错误.我该怎么做才能使错误冒泡到apache error_log中?
作为参考,代码可以在这个github永久链接上看到.
由于非常熟悉用Python编写纯SQL,我没有意识到使用SQLAlchemy或其他ORM可以获得的好处.
它是专为那些不喜欢程序中的SQL的人设计的吗?或者它是否使您的脚本跨越不同类型的数据库?
或者它使你的脚本更Pythonic?
或者对于处理底层数据库的某些任务来说它是非常有用的,并且它会自动为你做很多繁琐的事情,所以你只需要编写2-3行代码来调用SQLAlchemy并为你完成所有的trival数据库操作?
如果有人能够使用普通SQL和使用SQLALchemy提供代码演示并显示优于纯SQL的优点,那将是非常适用的.
谢谢!
我正在尝试集成PostgreSQL和SQLAlchemy,但SQLAlchemy.create_all()不是从我的模型创建任何表.
我的代码:
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql+psycopg2://login:pass@localhost/flask_app'
db = SQLAlchemy(app)
db.create_all()
db.session.commit()
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True)
email = db.Column(db.String(120), unique=True)
def __init__(self, username, email):
self.username = username
self.email = email
def __repr__(self):
return '<User %r>' % self.username
admin = User('admin', 'admin@example.com')
guest = User('guest', 'guest@example.com')
db.session.add(admin)
db.session.add(guest)
db.session.commit()
users = User.query.all()
print users
Run Code Online (Sandbox Code Playgroud)
但我得到这个错误: sqlalchemy.exc.ProgrammingError: (ProgrammingError) relation "user" does not exist
我怎样才能解决这个问题?
我目前正在玩SQLAlchemy,这真的很整洁.
为了测试,我创建了一个包含我的图片存档的大表,由SHA1哈希索引(删除重复:-)).这是令人印象深刻的快...
为了好玩,我select *在生成的SQLite数据库上做了相同的操作:
session = Session()
for p in session.query(Picture):
print(p)
Run Code Online (Sandbox Code Playgroud)
我希望看到哈希滚动,但它只是继续扫描磁盘.与此同时,内存使用率暴涨,几秒后达到1GB.这似乎来自SQLAlchemy的身份地图功能,我认为它只保留弱引用.
有人可以向我解释一下吗?我认为在写出哈希后会收集每个Picture p!?
我有一系列新对象.它们看起来都像这样:
Foo(pk_col1 = x,pk_col2 = y,val ='bar')
其中一些是存在的Foo(即只有val与db中的行不同)并且应该生成更新查询.其他人应该生成插入.
我可以想到几种方法,最好的方式:
pk_cols = Foo.table.primary_key.keys()
for f1 in foos:
f2 = Foo.get([getattr(f1, c) for c in pk_cols])
if f2 is not None:
f2.val = f1.val # update
# XXX do we need to do session.add(f2)
# (or at least keep f2 alive until after the commit?)
else:
session.add(f1) # insert
session.commit()
Run Code Online (Sandbox Code Playgroud)
有没有更简单的方法?
当使用早于9.1的PostgreSQL版本(为枚举添加ALTER TYPE)时,如何在alembic迁移中向Enum字段添加元素?这个 SO问题解释了直接过程,但我不太确定如何使用alembic进行翻译.
这就是我所拥有的:
new_type = sa.Enum('nonexistent_executable', 'output_limit_exceeded',
'signal', 'success', 'timed_out', name='status')
old_type = sa.Enum('nonexistent_executable', 'signal', 'success', 'timed_out',
name='status')
tcr = sa.sql.table('testcaseresult',
sa.Column('status', new_type, nullable=False))
def upgrade():
op.alter_column('testcaseresult', u'status', type_=new_type,
existing_type=old_type)
def downgrade():
op.execute(tcr.update().where(tcr.c.status==u'output_limit_exceeded')
.values(status='timed_out'))
op.alter_column('testcaseresult', u'status', type_=old_type,
existing_type=new_type)
Run Code Online (Sandbox Code Playgroud)
不幸的是,上面只ALTER TABLE testcaseresult ALTER COLUMN status TYPE status在升级时产生,基本上什么也没做.
SQLAlchemy的Query.distinct方法行为不一致:
>>> [tag.name for tag in session.query(Tag).all()]
[u'Male', u'Male', u'Ninja', u'Pirate']
>>> session.query(Tag).distinct(Tag.name).count()
4
>>> session.query(Tag.name).distinct().count()
3
Run Code Online (Sandbox Code Playgroud)
所以第二种形式给出了正确的结果,但第一种形式却没有.这似乎发生在SQLite中,但不适用于Postgres.我有一个函数,它传递一个查询对象来distinct应用一个子句,所以重写所有内容非常困难,最好使用上面的第二种方法.有什么明显的东西让我失踪吗?
python ×10
sqlalchemy ×10
postgresql ×2
sql ×2
alembic ×1
apache ×1
database ×1
flask ×1
mod-wsgi ×1
orm ×1
performance ×1
pylons ×1
sqlite ×1