标签: sqlalchemy

使用 SQLAlchemy 中的自定义逻辑自动递增属性

我有一个简单的“发票”类,其中包含一个“编号”属性,当用户保存发票时,应用程序必须为其分配该属性。有一些限制:

1) 应用程序是一个(瘦)客户端-服务器应用程序,所以无论分配数字,都必须注意冲突
2)发票也有一个“版本”属性,所以我不能使用简单的 DBMS 级别的自动递增字段

我正在尝试使用自定义类型来构建它,该类型会在每次保存发票时启动。每当 process_bind_param 使用 None 值调用时,它将调用某种单例来确定数量并避免冲突。这是一个体面的解决方案吗?无论如何,我遇到了问题..这是我的自定义类型:

class AutoIncrement(types.TypeDecorator):
   impl = types.Unicode

   def copy(self):
       return AutoIncrement()

   def process_bind_param(self, value, dialect):
       if not value:
           # Must find next autoincrement value
           value = "1" # Test value :)
       return value
Run Code Online (Sandbox Code Playgroud)

我现在的问题是,当我保存一个 Invoice 并且 AutoIncrement 将“1”设置为其编号的值时,Invoice 实例不会使用新编号更新。这是预期的吗?我错过了什么吗?非常感谢您的时间!

(Python 2.6 上的 SQLA 0.5.3,使用 postgreSQL 8.3)

编辑: Michael Bayer 告诉我这种行为是意料之中的,因为 TypeDecorators 不处理默认值。

python sqlalchemy auto-increment

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

SQLAlchemy Core select where条件包含布尔表达式`是False`

如何使用SQLAlchemy表达式语言选择where where condition来检查布尔表达式.例:

select([table]).\
    where(and_(table.c.col1 == 'abc',
               table.c.is_num is False 
    ))
Run Code Online (Sandbox Code Playgroud)

这不会给出语法错误,但会错误地评估条件.我不能使用== False给出错误.SQLAlchemy Core v.1.0.8

python sqlalchemy

1
推荐指数
2
解决办法
953
查看次数

sqlalchemy无法连接,但cx_oracle成功

我正在尝试使用Python连接到Oracle服务器。我可以在cx_Oracle中使用它,但是当我尝试使用sqlalchemy连接时会失败。cx_Oracle代码:

import cx_Oracle
import pandas as pd

cx_connection = cx_Oracle.connect(user+'/' + pw + '@' + host + ':' + port + '/' + db)
df = pd.read_sql(my_query, cx_connection)
Run Code Online (Sandbox Code Playgroud)

根据查询执行并从数据库返回数据。如果我尝试使用sqlalchemy进行相同的连接:

import sqlalchemy

engine = sqlalchemy.create_engine('oracle+cx_oracle://' + user + ':' + pw + '@' + host + ':' + port + '/' + db)
sqlalchemy_connection = engine.connect()
Run Code Online (Sandbox Code Playgroud)

我在最后一行收到错误:

DatabaseError:(cx_Oracle.DatabaseError)ORA-12505:TNS:listener当前不知道连接描述符中给出的SID(有关此错误的背景,网址为:http : //sqlalche.me/e/4xp6

知道是什么问题吗?sqlalchemy不只是使用cx_Oracle吗?有什么解决方法可以将cx_Oracle连接赋予sqlalchemy吗?

python cx-oracle sqlalchemy

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

使用SQLMap中的凭据直接连接到数据库

我具有TARGET网站数据库和SQLMap 的凭据,可以直接连接到数据库。这是我在Kali Linux上有关SQLMap的命令

sudo sqlmap -d mysql://USER:PASSWORD@TARGET_IP:MySQL_Port/DATABASE
Run Code Online (Sandbox Code Playgroud)

sudo sqlmap -d mysql://admin:12345@95.12.45.12:3306/information_schema
Run Code Online (Sandbox Code Playgroud)

但这是我每次都遇到的错误

[CRITICAL]  SQLAchemy connection issue ('(_mysql_exceptions.OperationalError)
(1045, "Access denied for user 'admin'@'17.45.65.11' (using password: YES)")')
Run Code Online (Sandbox Code Playgroud)

该IP 17.45.65.11是我的IP ofc,拒绝了

那么我的命令有问题吗?

还是有人知道使用凭证直接连接到目标数据库的更好方法?

python mysql sql-injection sqlalchemy sqlmap

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

如何使用SQLAlchemy的`one_or_none`查询方法?

我正在尝试使用one_or_none查询方法从数据库中检索记录,但是当我像通常使用该filter_by方法那样传递kwargs时,它说它不希望使用该关键字。

我尝试遍历doc,但是没有方法的参数或示例的描述。

python sqlalchemy

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

sqlalchemy:“ metadata.drop_all”不起作用

我试图通过使用'Base.metadata.drop_all(bind = engine)'删除架构中的所有现有表,然后重新创建一个新表。但是,该表并没有像我所想的那样被删除,而是将记录追加到了旧表上。我是sqlalchemy的新手,谁能告诉我我在做什么错...谢谢!

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

engine = create_engine("mysql+pymysql://root:pswd@127.0.0.1:3306/bond?charset=utf8", echo=True)
Session = sessionmaker(bind=engine)
session = Session()
Base = declarative_base(bind=engine)
Base.metadata.drop_all(bind=engine)
table = Table('TradeHistory', Base.metadata,
     Column('Id', Integer, primary_key=True),
     Column('trade_date', String(50)),
     Column('rem_period', String(50)),
      Column('bond_code', String(50)),
      Column('bond_name', String(50)),
      Column('bond_rating', String(50)),
      Column('bond_yield', String(50)),
      Column('note', String(50)),
      Column('offer', String(50)),
      Column('bid', String(50)),
      Column('amount', String(50)))
Base.metadata.create_all(bind=engine)
conn.execute(table.insert(), listToWrite)
session.commit()
session.close()
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy

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

SQLAlchemy-发生异常时回滚

我需要回滚中的事务core.event 'handle_error' (catch 'KeyboardInterrupt'),但是此事件中的参数是ExceptionContext,该怎么做?

python sqlalchemy

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

SQLAlchemy无法在更新值时设置属性错误

mailtable在后端PostgreSQL数据库中有一个表,并且正在使用SQLAlchemy ORM使用给定的查询它mailId。对于以下代码,amEngine已经设置了。当到达该mailRow.usercomment = 'Hello World'行时,它抛出:

AttributeError:无法设置属性

Base = declarative_base()
Base.metadata.reflect(amEngine)
metaAm = MetaData()
metaAm.reflect(bind=amEngine)
mt = metaAm.tables['mailtable']
Session = sessionmaker(bind=amEngine)
amSession = Session()
mailRow = amSession.query(
        mt
    ).filter(
        mt.c.id == mailId
    ).first()
mailAddress = mailRow.address
mailRow.usercomment = 'Hello World'
amSession.flush()
amSession.commit()
Run Code Online (Sandbox Code Playgroud)

我需要阅读该address列(成功)并更新该usercomment列(引发异常)。两列的PostgreSQL类型均为text。我怎样才能做到这一点?我确信这肯定是一个非常简单的问题,但是对于我一生来说,我看不到这个问题。

非常感谢。

python postgresql sqlalchemy

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

他们为什么在这里使用.first?

在我的课堂上,他们使用了以下代码:

pet = session.query(Pet).filter_by(name="Marshmallow").first()
Run Code Online (Sandbox Code Playgroud)

.first()这里做什么?

python sqlalchemy

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

SQLAlchemy用于主键列的顺序是什么?

假设我创建了一个这样的表:

table = Table('mytable', metadata,
   Column('a', Integer, primary_key=True),
   Column('b', Integer, primary_key=True),
)
table.create()
Run Code Online (Sandbox Code Playgroud)

是否保证主键是(a,b)而不是(b,a)?

python sqlalchemy

0
推荐指数
1
解决办法
292
查看次数