我有一个关于Python和sqlalchemy模块的问题.cursor.rowcountsqlalchemy Python中的等价物是什么?
我有两个Flask-SQLAlchemy模型,具有简单的一对多关系,如下面的最小示例:
class School(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(30))
address = db.Column(db.String(30))
class Teacher(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(30))
id_school = db.Column(db.Integer, db.ForeignKey(School.id))
school = relationship('School', backref='teachers')
Run Code Online (Sandbox Code Playgroud)
然后我向使用该关系的教师添加混合属性,如:
@hybrid_property
def school_name(self):
return self.school.name
Run Code Online (Sandbox Code Playgroud)
当我使用它时,该属性工作得很好teacher_instance.school_name.但是,我也想提出类似的查询Teacher.query.filter(Teacher.school_name == 'x'),但这给了我一个错误:
`AttributeError: Neither 'InstrumentedAttribute' object nor
'Comparator' object has an attribute 'school_name'`.
Run Code Online (Sandbox Code Playgroud)
在SQLAlchemy文档之后,我添加了一个简单的混合表达式,如下所示:
@school_name.expression
def school_name(cls):
return School.name
Run Code Online (Sandbox Code Playgroud)
但是,当我再次尝试相同的查询时,它会生成一个没有join子句的SQL查询,因此我获得了School中所有可用的行,而不仅仅是那些与Teacher中的外键匹配的行.
从SQLAlchemy文档中我意识到表达式需要一个已经存在连接的上下文,所以我再次尝试查询:
Teacher.query.join(School).filter(Teacher.school_name == 'x')
这实际上是有效的,但是如果我需要学校模型的知识来实现这一目的,那就首先试图在那里试图获得语法糖.我希望有一种方法可以在表达式中加入,但我无法在任何地方找到它.该文档有一个示例,表达式返回一个直接用它构建的子查询select(),但即使这对我没用.
有任何想法吗?
UPDATE
在下面的Eevee回答之后,我使用了建议的关联代理并且它有效,但我也对它应该与select()子查询一起工作的评论感到好奇,并试图弄清楚我做错了什么.我最初的尝试是:
@school_name.expression
def school_name(cls):
return select(School.name).where(cls.id_school == School.id).as_scalar() …Run Code Online (Sandbox Code Playgroud) SQLAlchemy是否支持某种缓存,所以如果我重复运行相同的查询,它会从缓存中返回响应而不是查询数据库?更新数据库时是否自动清除此缓存?
或者在CherryPy + SQLAlchemy设置上实现此功能的最佳方法是什么?
SELECT *在SQLAlchemy中可以做到吗?
具体来说,SELECT * WHERE foo=1?
我正在使用SQLalchemy作为Python项目,我希望有一个整洁的连接字符串来访问我的数据库.例如:
engine = create_engine('postgres://user:pass@host/database')
Run Code Online (Sandbox Code Playgroud)
问题是我的密码包含一系列特殊字符,在我尝试连接时会被解释为分隔符.
我意识到我可以创建一个对象然后传递我的凭据,如下所示:
drivername = 'postgres',
username = 'user',
password = 'pass',
host = 'host',
database = 'database'
Run Code Online (Sandbox Code Playgroud)
但是如果可能的话,我宁愿使用连接字符串.
所以要清楚,是否可以编码我的连接字符串或连接字符串的密码部分 - 以便可以正确解析它?
对于Django,是否有像South的SQLAlchemy自动迁移工具?
我查看了sqlalchemy-migrate,但它似乎没有自动生成sql更新脚本或升级降级数据库
看起来像sqlalchemy-migrate你需要a)手动将旧模型复制到新文件b)在应用程序中创建新模型并将其复制到新文件c)在python sqlalchemy扩展方言d中手动创建/删除/更改表)生成sql alter script e)运行命令执行alter sql脚本
至于我它没有解决问题,只增加了开销,因为我可以简单地做d)手动,它会快得多a),b),c)手动只是为了d)你可以做一个步.
SQLAlchemy是否有像JDBC for Django或许多类似RoR的迁移工具的自动迁移库?
我需要的是在python app中更改SQLAlchemy模型,运行工具,它会将当前的数据库模式与新模型应该使用的新数据库模式进行比较,并创建我可以手动调整并执行的Alter脚本.
在Python中有这样的解决方案吗?
我在Pyramid应用程序中有这个表
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
.....
is_active = Column(Boolean, unique=False)
def __init__(self, name, raw_password):
is_active = True
Run Code Online (Sandbox Code Playgroud)
当我做我的测试时,它说is_active是没有.
def test_register_user(self):
user = User('user1', '1234')
self.sess.add(user)
self.sess.flush()
#print user
#self.assertTrue(user.is_active, True)
user_db_record = self.sess.query(User).filter_by(name=user.name).first()
self.assertEqual(user_db_record.is_active, True)
Run Code Online (Sandbox Code Playgroud)
从我的集成日志中,我看到在创建行时,is_active将其设置为None.为什么?
最近我发现SQLAlchemy的Column默认不起作用,因为我期望它:
>>> Base = declarative_base()
>>> class TestModel(Base):
... __tablename__ = 'tmodel'
... id = sa.Column(sa.Integer, primary_key=True)
... foo = sa.Column(sa.Integer, default=0)
...
>>> tmodel_instance = TestModel()
>>> print tmodel_instance.foo
None
>>> session.add(tmodel_instance)
>>> print tmodel_instance.foo
None
>>> session.commit()
>>> print tmodel_instance.foo
0
Run Code Online (Sandbox Code Playgroud)
我希望在对象实例化之后tmodel_instance.foo立即相等0,但似乎默认值仅在执行INSERT命令时使用,它确实让我感到困惑.为什么一个人更喜欢 default结束server_default?我如何实现我想要的目标?我应该指定所有默认参数__init__吗?这似乎是代码重复:更改默认值我必须将其更改两次并保持这些值相等 - 是否有某种方法可以避免这种情况?
sqlalchemy是Python的数据库连接模块,默认情况下使用SQL身份验证(数据库定义的用户帐户).如果要使用Windows(域或本地)凭据对SQL Server进行身份验证,则必须更改连接字符串.
默认情况下,由sqlalchemy定义,连接到SQL Server的连接字符串如下所示:
sqlalchemy.create_engine('mssql://*username*:*password*@*server_name*/*database_name*')
Run Code Online (Sandbox Code Playgroud)
如果使用您的Windows凭据,这将抛出类似于此的错误:
sqlalchemy.exc.DBAPIError: (Error) ('28000', "[28000] [Microsoft][ODBC SQL Server Driver][SQL Server]Login failed for us
er '***S\\username'. (18456) (SQLDriverConnect); [28000] [Microsoft][ODBC SQL Server Driver][SQL Server]Login failed for us
er '***S\\username'. (18456)") None None
Run Code Online (Sandbox Code Playgroud)
在此错误消息中,代码18456标识SQL Server自身引发的错误消息.此错误表示凭据不正确.
我写了一个模块来创建一个空的数据库文件
def create_database():
engine = create_engine("sqlite:///myexample.db", echo=True)
metadata = MetaData(engine)
metadata.create_all()
Run Code Online (Sandbox Code Playgroud)
但是在另一个函数中,我想打开myexample.db数据库,如果它还没有该表,则创建表.
我将创建的第一个后续表的EG将是:
Table(Variable_TableName, metadata,
Column('Id', Integer, primary_key=True, nullable=False),
Column('Date', Date),
Column('Volume', Float))
Run Code Online (Sandbox Code Playgroud)
(因为它最初是一个空数据库,它将没有表格,但随后,我可以添加更多表格.这就是我想说的.)
有什么建议?
sqlalchemy ×10
python ×9
caching ×1
cherrypy ×1
database ×1
migration ×1
pyramid ×1
sql-server ×1