Tag: sqlalchemy

使用SQLAlchemy ORM批量插入

有没有办法让SQLAlchemy做一个批量插入,而不是插入每个单独的对象。 即 这样做的: INSERT INTO `foo` (`bar`) VALUES (1), (2), (3) 而不是: INSERT INTO `foo` (`bar`) VALUES (1) INSERT INTO `foo` (`bar`) VALUES (2) INSERT INTO `foo` (`bar`) VALUES (3) 我刚刚转换了一些代码来使用sqlalchemy,而不是原始的sql,虽然现在好多了,但现在看起来比较慢(高达10倍),我想知道这是否是原因。 也许我可以更有效地改善使用会话的情况。 目前我有autoCommit=False ,并添加了一些东西后,做一个session.commit() 。 虽然这似乎导致数据如果数据库在其他地方更改,如果即使我做了一个新的查询,我仍旧得到旧的结果? 谢谢你的帮助!

SQLAlchemy的默认date时间

这是我的声明模型: import datetime from sqlalchemy import Column, Integer 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) 但是,当我尝试导入这个模块,我得到这个错误: 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 = […]

MongoKit与MongoEngine和Flask-MongoAlchemy for Flask

任何人都有MongoKit,MongoEngine或Flask-MongoAlchemy for Flask的经验吗? 你更倾向哪个? 积极或消极的经历? 太多的选项为烧瓶新手。

SQLAlchemy:如何过滤date字段?

这里是模型: class User(Base): … birthday = Column(Date, index=True) #in database it's like '1987-01-17' … 我想在两个date之间过滤,例如select间隔18 – 30年的所有用户。 如何用SQLAlchemy实现它? 我想: query = DBSession.query(User).filter( and_(User.birthday >= '1988-01-17', User.birthday <= '1985-01-17') ) # means age >= 24 and age <= 27 我知道这是不正确的,但如何做到正确? 提前致谢!

sqlalchemy刷新()并获得插入ID?

我想要做这样的事情: f = Foo(bar='x') session.add(f) session.flush() # do additional queries using f.id before commit() print f.id # should be not None session.commit() 但是,当我尝试它时,f.id是None。 我怎样才能使这个工作? -担

我如何知道我是否可以禁用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.') 我试图找出这个选项的作用,但是Flask-SQLAlchemy文档并不清楚使用这个跟踪的是什么。 SQLALCHEMY_TRACK_MODIFICATIONS 如果设置为True(默认),Flask-SQLAlchemy将跟踪对象的修改并发出信号。 这需要额外的内存,如果不需要,可以禁用。 如何知道我的项目是否需要SQLALCHEMY_TRACK_MODIFICATIONS = True或者如果我可以安全地禁用此function并将内存保存在我的服务器上?

迭代sqlalchemy模型的定义列的方法?

我一直想弄清楚如何迭代在SqlAlchemy模型中定义的列的列表。 我想要写一些序列化和复制方法到一些模型。 我不能只遍历obj。 字典,因为它包含了大量的特定于SA的项目。 任何人都知道一个方法来获得id,并从以下desc名称? class JobStatus(Base): __tablename__ = 'jobstatus' id = Column(Integer, primary_key=True) desc = Column(Unicode(20)) 在这个小案例中,我可以轻松地创build一个: def logme(self): return {'id': self.id, 'desc': self.desc} 但我更喜欢自动生成大对象的东西。 感谢您的帮助。

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

我正在开始一个新的应用程序,并着眼于使用ORM – 特别是SQLAlchemy。 假设我在数据库中有一个'foo'列,我想增加它。 在sqlite中,这很简单: db = sqlite3.connect('mydata.sqlitedb') cur = db.cursor() cur.execute('update table stuff set foo = foo + 1') 我想出了SQLAlchemy的SQL构build器等价物: 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) 这稍微慢一些,但是没有太多。 这是我对SQLAlchemy ORM方法的最佳猜测: # snip definition of Stuff class made using declarative_base # snip creation of session object for […]

sqlalchemy在多个列中是唯一的

假设我有一个代表位置的类。 地点“属于”客户。 位置由unicode 10字符代码标识。 “位置代码”在特定客户的位置中应该是唯一的。 The two below fields in combination should be unique customer_id = Column(Integer,ForeignKey('customers.customer_id') location_code = Column(Unicode(10)) 所以如果我有两个客户,客户“123”和客户“456”。 他们都可以有一个叫做“main”的位置,但是两个位置都不能有main。 我可以在业务逻辑中处理这个问题,但我想确保在sqlalchemy中无法轻松添加需求。 唯一= True选项似乎只适用于特定字段时才起作用,并且会导致整个表只针对所有位置具有唯一的代码。

SQLAlchemy有相当于Django的get_or_create吗?

我想从数据库中获取一个对象,如果它已经存在(基于提供的参数),或者创build它,如果它不存在。 Django的get_or_create (或源 )这样做。 在SQLAlchemy中有没有等价的快捷方式? 我现在正在写这个明确的: def get_or_create_instrument(session, serial_number): instrument = session.query(Instrument).filter_by(serial_number=serial_number).first() if instrument: return instrument else: instrument = Instrument(serial_number) session.add(instrument) return instrument